键范围:当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。在使用可序列化事务隔离级别时,对于 Transact-SQL 语句读取的记录集,键范围锁可以隐式保护该记录集中包含的行范围。 键范围锁可防止幻读。 通过保护行之间键的范围,它还防止对事务访问的记录集进行幻像插入或删除。 兼容性矩阵
简单的兼容性矩阵如下图:
完整的兼容性矩阵如下图所示: 锁升级
一个T-SQL语句中的一个特定表的行或页有超过5000个锁时,就会触发锁升级。在这个过程中,更高层的意向锁会转换为全锁----假如升级为全锁成为可能并且没有被其他锁阻止----那么更多细粒度的锁会被释放,腾出需要管理的资源。如果由于并发事务所持有的锁冲突而导致锁升级尝试失败,则数据库引擎将对事务获取的其他 1,250 个锁重试锁升级。你可以使用跟踪标志 1211 和 1224 来禁用锁升级。更多信息可以参考http://msdn.microsoft.com/zh-cn/library/ms184286(v=sql.105).aspx。 死锁
数据库引擎侦测到死锁时,会终止一个线程,解析死锁。终止的线程获取一个1205错误,它建议如何解决它:
Error 1205 : Transaction (Process ID) was deadlocked on resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
的确,重跑事务常常是最好的做法。一个事务锁定一个资源,然后试图获取另一个资源上的锁但被另一个事务阻塞。直到第二个事务完成并释放它的锁,第一个事务才能完成。然而,如果第二个事务做什么要等待第一个事务,它们将永久等待。幸运的是,数据库引擎会侦测到,并终止其中一个进程。诊断问题可以使用追踪事件,如Lock:Deadlock和死锁图表事件。更多关于死锁的信息可以参考http://msdn.microsoft.com/zh-cn/library/ms177433(v=sql.105).aspx。