为整个连接锁定SQL Server表
我正在从SQLServer数据库中的表中读取一个参数,对其进行递增,然后在此基础上进行一些其他计算,然后使用这些新的计算值编写一些SQL查询为整个连接锁定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
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女士的新手。你能给我一些建议吗?谢谢!我改变了我的逻辑流程,它似乎在一个交易适合工作谢谢!我改变了我的逻辑流程,它似乎在一个事务中工作