Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为整个连接锁定SQL Server表_Sql_Sql Server_Database_Sql Server 2014 - Fatal编程技术网

为整个连接锁定SQL Server表

为整个连接锁定SQL Server表,sql,sql-server,database,sql-server-2014,Sql,Sql Server,Database,Sql Server 2014,我正在从SQLServer数据库中的表中读取一个参数,对其进行递增,然后在此基础上进行一些其他计算,然后使用这些新的计算值编写一些SQL查询 SELECT TOP 1 fruitId FROM fruits WITH (TABLOCK, HOLDLOCK) WHERE fruitId LIKE '1978%' ORDER BY fruitId DESC 在获得这个水果Id后,进行一些数学运算,然后将数据写入几个表中 我在一个事务中写入这3个表 SET TRANSACTION ISOLAT

我正在从SQLServer数据库中的表中读取一个参数,对其进行递增,然后在此基础上进行一些其他计算,然后使用这些新的计算值编写一些SQL查询

SELECT TOP 1 fruitId 
FROM fruits WITH (TABLOCK, HOLDLOCK) 
WHERE fruitId LIKE '1978%' 
ORDER BY fruitId DESC
在获得这个水果Id后,进行一些数学运算,然后将数据写入几个表中

我在一个事务中写入这3个表

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

BEGIN TRANSACTION 
    INSERT INTO Fruits (fruitId, fruitName, fruitColor) 
    VALUES 197867, 'Apple', 'Red';

    INSERT INTO Salad (saladId, saladName) 
    VALUES 1234, 'Apple Salad';

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234, 197867;

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234,197866;

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234, 197980;

    COMMIT TRANSACTION
我的锁对插入部分很有效。但是,如果有人从fruits中读取了fruitId,那么计算就完成了,但由于fruitId必须是唯一的,因此稍后提交事务时,写入代码将失败

是否可以在整个连接中保持水果桌上的锁

否,数据锁的作用域必须由事务确定

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

BEGIN TRANSACTION 
    INSERT INTO Fruits (fruitId, fruitName, fruitColor) 
    VALUES 197867, 'Apple', 'Red';

    INSERT INTO Salad (saladId, saladName) 
    VALUES 1234, 'Apple Salad';

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234, 197867;

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234,197866;

    INSERT INTO Ingredients(saladId, FruitId) 
    VALUES 1234, 197980;

    COMMIT TRANSACTION
您需要使用(TABLOCKX)以独占模式锁定表。您的事务必须跨越读取和插入

表现将非常糟糕


调查。

是否有可能为整个连接在水果表上保持一个锁-即使这是可能的-这是一个非常糟糕的主意-您需要重新考虑您的策略,这不是我试图通过此方法写入旧应用程序的方式。插入集每次最多50行,并使用计算出的果ID。我是sql女士的新手。你能给我一些建议吗?谢谢!我改变了我的逻辑流程,它似乎在一个交易适合工作谢谢!我改变了我的逻辑流程,它似乎在一个事务中工作