在sql server中发生死锁时,哪个事务将被中止
Posted
技术标签:
【中文标题】在sql server中发生死锁时,哪个事务将被中止【英文标题】:in sql server when deadlock occured, WHICH transaction will be abort 【发布时间】:2014-04-09 15:08:07 【问题描述】:当sql server发生死锁时,哪些事务会被中止。我的意思是 sql server 决定哪些事务应该被杀死的计划是什么!
考虑下面的两个交易
交易A
begin transaction
update Customers set LastName = 'Kharazmi'
waitfor delay '00:00:5'; -- waits for 5 second
update Orders set OrderId=13
commit transaction
交易 B
begin transaction
update Orders set OrderId=14
waitfor delay '00:00:5'; -- waits for 5 second
update Customers set LastName = 'EbneSina'
commit transaction
如果两个事务同时执行,事务 A 锁定并更新 Customers 表,而事务 B 锁定并更新 订单 表。延迟 5 秒后,事务 A 在 Orders 表上查找已被事务 B 和事务 B 持有的锁 在 Customers 表上查找已由事务 A 持有的锁。所以这两个事务都不能继续进行,就会发生死锁。 我的问题是,当发生死锁时,两个事务中的哪一个将被中止。 首先,我执行事务 A 然后事务 B,sql server 中止事务 A 然后首先执行事务 B 然后 A 结果相同,事务 A 再次被异常。这让我很困惑! 感谢您的帮助。
【问题讨论】:
【参考方案1】:你可以在SET DEADLOCK_PRIORITY (Transact-SQL)了解条件:
选择哪个会话作为死锁牺牲品取决于每个会话 会话的死锁优先级:
如果两个会话具有相同的死锁优先级,则 SQL Server 实例选择回滚成本较低的会话作为 僵局的受害者。例如,如果两个会话都设置了它们的 死锁优先级为 HIGH,实例将选择作为受害者 它估计回滚的会话成本更低。
如果会话具有不同的死锁优先级,则选择死锁优先级最低的会话作为死锁牺牲品。
对于您的情况,DBMS 应将 A 视为成本较低的回滚事务。
【讨论】:
谢谢,太完美了!【参考方案2】:没有办法只看查询就知道。基本上,据我了解,引擎会考虑死锁中涉及的所有事务,并尝试找出哪一个将是“最便宜”的回滚。
因此,如果您的 Customers
表中有 2 行,而您的 Orders
表中有 9000000 行,则回滚应用于 UPDATE
的 UPDATE
比回滚应用于 Customers
的行要便宜得多已应用于Orders
。
【讨论】:
以上是关于在sql server中发生死锁时,哪个事务将被中止的主要内容,如果未能解决你的问题,请参考以下文章