【问题标题】:SQL Server: can a transaction deadlock on COMMIT?SQL Server:COMMIT 上的事务可以死锁吗?
【发布时间】:2021-10-27 13:49:31
【问题描述】:

想象一个 SQL Server 事务,例如两个原子 SQL 语句,AB

begin tran

insert into .. (**A**)

update .. (**B**)

commit tran

AB 中的任何一个都可能导致死锁 - 如果其中任何一个发生并且如果我们的事务被选为死锁受害者,那么太糟糕了 - 我们无法继续。

现在假设我们在脚本中没有发生死锁:

--all done except for:
commit tran

这里有可能发生死锁吗?即所有实际的插入/删除/更新/已经运行的所有内容之后,COMMIT 上会发生死锁吗?

【问题讨论】:

  • 可能不会。该引擎经过优化以假设事务将被提交,因此提交基本上是一种形式,在事务日志中写入一切顺利——这是代价高昂的回滚。我说“可能不会”是因为提交似乎确实需要采取某些内部锁存器,并且在 理论上 如果这些提交并不总是以相同的顺序进行,则可能会与另一个提交发生死锁,但是至少可以说,如果引擎的设计带有这样的设计缺陷,那将是非常奇怪的。更好的问题,可能是:你认为知道这会对你有什么好处?

标签: sql-server transactions


【解决方案1】:

不,我不相信这是可能的。

在提交时,所有需要获取的锁都已被获取。唯一需要做的事情是提交事务日志(使其持久),这只需要一个闩锁。据我了解,闩锁不会死锁。


可能存在一个问题:

SNAPSHOT隔离下运行时,可能会发生更新冲突

Snapshot isolation transaction aborted due to update conflict. 

这不是死锁,虽然它有类似的效果,导致一个完整的事务中止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多