如果以相同的顺序访问对象,如何发生死锁?

Tim*_*mwi 5 sql sql-server transactions database-deadlocks

关于"最小化死锁"的MS Technet页面上,它说"无法完全避免死锁".更具体地说,它表明了这一点

如果所有并发事务以相同顺序访问对象,则不太可能发生死锁.

这意味着即使所有事务以相同的顺序访问对象,理论上也可能发生死锁.有人可以举例说明如何做到这一点吗?

Mar*_*ith 3

只是为了进一步为 Charles 的回答提供一个简单的代码示例

CREATE TABLE T(X INT)
Run Code Online (Sandbox Code Playgroud)

然后在两个并发连接中运行

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

SELECT * FROM T 

WAITFOR DELAY '00:00:10'

INSERT INTO T VALUES(1)

COMMIT
Run Code Online (Sandbox Code Playgroud)

僵局。

问题在于,两个连接都可以获取资源上的共享锁,但当它们需要将其转换为排它锁时,会互相阻塞。