【发布时间】:2014-02-13 12:48:19
【问题描述】:
我有3个存储过程(简化,请尽量忽略我为什么要更新表两次以及为什么调用SP两次):
CREATE SP1 AS
BEGIN TRANSACTION
-- Updated twice
UPDATE Customers SET Name = 'something' Where Id = 1 OUTPUT INSERTED.*
UPDATE Customers SET Name = 'something'
COMMIT TRANSACTION;
END
CREATE SP2 AS
BEGIN TRANSACTION
UPDATE Customers SET Name = 'anothername'
COMMIT TRANSACTION;
END
CREATE SP3 AS
BEGIN TRANSACTION
-- Called twice
EXEC SP2
EXEC SP2
COMMIT TRANSACTION;
END
问题是我从 sql server 遇到了死锁。它说 SP1 和 SP3 都在等待客户表资源。是否有意义?可能是因为 SP2 中的内部事务?或者也许使用 OUTPUT 语句...?
锁是客户PK上的钥匙锁。每个等待的 SP 请求的锁定模式是 U,所有者是 X(我猜是另一个对象)。
更多细节: 1. 这些在不同的进程上被同一个用户多次调用。 2. 语句被调用两次只是为了示例。 3. 在我的实际代码中,客户实际上被称为“待处理指令”。每个听众(实际上是计算机)每分钟对指令表进行一次采样。 4. 第一个更新查询首先获取所有待处理的指令,第二个更新整个表的状态为已完成,只是为了确保没有一个处于待处理模式。 5. SP3 调用 SP2 两次,因为它更新了 2 个专有指令行,这种情况每天发生一次。
非常感谢!!
【问题讨论】:
-
您总是更新完整的客户表还是只更新一个子集?这些存储过程是被称为线性的还是来自不同的用户多次?请原谅我问,但你为什么要更新它们两次? :)
-
添加了更多有问题的信息,请查看。第一次更新是 1 行,第二次是整个表。多次从不同的用户调用。
标签: sql-server stored-procedures deadlock database-deadlocks