在非常罕见的情况下,我在我的Delphi程序中遇到了一个异常,它显示了SQL Server 2012的以下问题:
事务(进程ID xxx)在锁资源上与另一个进程死锁,并被选为死锁牺牲品。重新运行 交易
我read about deadlocks我认为我确实了解在哪种情况下会出现死锁。
失败的交易看起来像这样:
BEGIN TRANSACTION
SELECT currentVal FROM numbers where ID = ...
UPDATE numbers SET currentVal = currentVal + 1 where ID = ... // <-- Exception here
COMMIT
我的应用程序的堆栈跟踪显示错误发生在UPDATE语句中,而不是在COMMIT期间。
我不明白这个事务如何导致死锁。 UPDATE可以强制其他事务等待,但只是短时间,因为UPDATE子句将正常结束,而事务不必等待正在等待的另一个事务。
触发器不存在。
是否有人提示在此次交易中发生了什么?如果有什么我可以改进的话?