在今天的文章里我想谈论下在可重复读隔离级别(Transaction Isolation Level Repeatable Read)里,当你运行事务时可能引起的2类死锁。当你使用可重复读(Repeatable Read)隔离级别设置你的事务,SQL Server对读取数据把持需要的共享锁(Shared Locks)直到事务的结束(COMMIT或ROLLBAK)。然后当你尝试修改读取的数据(通过UPDATE语句),如果同样的事务多次并发运行,它会英气不同类型的死锁。
循环死锁(Cycle Deadlock)
循环死锁是其中一个最常见的死锁——你就以不同顺序访问资源(例如不同表),最后每个查询等待另一个。使用可重复读隔离级别,但你用多个事务只读写一个表时,也是有可能引起循环死锁。我们来看第1个事务的T-SQL代码:
1 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
2 GO
3
4 BEGIN TRANSACTION
5
6 SELECT * FROMPerson.Person7 WHERE ModifiedDate = '20030208'
8
9 UPDATEPerson.Person10 SET FirstName = '...'
11 WHERE ModifiedDate = '20030208'
12
13 SELECT * FROMPerson.Person14 WHERE ModifiedDate = '20030209'
15
16 UPDATEPerson.Person17 SET FirstName = '...'
18