在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 秒后,事务 AOrders 表上查找已被事务 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 行,则回滚应用于 UPDATEUPDATE 比回滚应用于 Customers 的行要便宜得多已应用于Orders

【讨论】:

以上是关于在sql server中发生死锁时,哪个事务将被中止的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 事务复制分发到订阅同步慢

三级封锁协议

sql server 2000 单用户如何设置?

sql server 2012 事务日志在哪

在 nem 中发起事务返回 FAILURE_WRONG_NETWORK

对于银行应用程序,SQL 事务或 Java 端事务哪个更好?