这个视频使用下面的脚本成功地模拟了 SQL Server 的死锁。死锁发生在两个事务在拿到了对方需要的锁的以后,又申请对方已经拿到的锁的条件下。死锁虽然不会造成阻塞 (blocking) 但是会造成 SQL Server 性能下降,因为侦测和解除死锁需要消耗额外的资源,所以在面试数据库相关的职位时会经常被问到。
视频链接: https://live.youkuaiyun.com/v/142521
模拟步骤:
- 运行建立 SampleTable 表的脚本
- 运行 Transaction A 中 ID=2 的 Update 脚本
- 运行 Transaction B 中 ID=3 的 Update 脚本
- 运行 Transaction A 中 ID=3 的 Update 脚本并且 commit
- 运行 Transaction B 中 ID=2 的 Update 脚本并且 commit
Transaction A
SELECT @@SPID
IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'SampleTable')
DROP TABLE SampleTable
CREATE T