Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql server中发生死锁时,将中止哪个事务_Sql_Transactions_Sql Server 2012_Deadlock_Rollback - Fatal编程技术网

在sql server中发生死锁时,将中止哪个事务

在sql server中发生死锁时,将中止哪个事务,sql,transactions,sql-server-2012,deadlock,rollback,Sql,Transactions,Sql Server 2012,Deadlock,Rollback,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

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锁定并更新客户表,而事务B锁定并更新订单表。延迟5秒后,事务a查找已由事务B持有的订单锁定表,事务B查找已由事务a持有的客户锁定表。因此,这两个事务都无法进一步进行,出现了死锁。 我的问题是,当死锁发生时,这两个事务中的哪一个将被中止。 首先,我执行事务A然后执行事务B,sql server中止事务A,然后首先执行事务B,然后执行事务A,结果相同,事务A再次被删除。这把我弄糊涂了!
感谢您的帮助。

您可以在以下内容中了解标准:

选择哪个会话作为死锁受害者取决于每个会话 会话的死锁优先级:

  • 如果两个会话具有相同的死锁优先级,SQL Server实例将选择回滚成本较低的会话作为 僵局受害者。例如,如果两个会话都设置了 死锁优先级为高,实例将选择作为牺牲品 它估计的会话回滚成本较低

  • 如果会话具有不同的死锁优先级,则选择死锁优先级最低的会话作为死锁受害者


对于您的情况,A应该被DBMS视为回滚成本较低的事务。

仅通过查看查询无法知道。基本上,据我所知,引擎会考虑死锁中涉及的所有事务,并试图确定哪一个是要回滚的“奶酪虫”


因此,如果说,您的
客户
表中有2行,您的
订单
表中有9000000行,那么回滚应用于
客户
更新
比应用于
订单
的更新要便宜得多。谢谢,这太完美了!