【发布时间】:2021-10-27 13:49:31
【问题描述】:
想象一个 SQL Server 事务,例如两个原子 SQL 语句,A 和 B。
begin tran
insert into .. (**A**)
update .. (**B**)
commit tran
A 或 B 中的任何一个都可能导致死锁 - 如果其中任何一个发生并且如果我们的事务被选为死锁受害者,那么太糟糕了 - 我们无法继续。
现在假设我们在脚本中没有发生死锁:
--all done except for:
commit tran
这里有可能发生死锁吗?即在所有实际的插入/删除/更新/已经运行的所有内容之后,COMMIT 上会发生死锁吗?
【问题讨论】:
-
可能不会。该引擎经过优化以假设事务将被提交,因此提交基本上是一种形式,在事务日志中写入一切顺利——这是代价高昂的回滚。我说“可能不会”是因为提交似乎确实需要采取某些内部锁存器,并且在 理论上 如果这些提交并不总是以相同的顺序进行,则可能会与另一个提交发生死锁,但是至少可以说,如果引擎的设计带有这样的设计缺陷,那将是非常奇怪的。更好的问题,可能是:你认为知道这会对你有什么好处?