根据微软联机丛书,死锁的类型如下:
- 防止其他事务以会使较低级别的锁无效的方式修改较高级别资源。
- 提高数据库引擎在较高的粒度级别检测锁冲突的效率。
例如,在该表的页或行上请求共享锁(S 锁)之前,在表级请求共享意向锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排他锁(X 锁)。意向锁可以提高性能,因为数据库引擎仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而不需要检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。意向锁包括意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。
意向共享 (IS) 保护针对层次结构中某些(而并非所有)低层资源请求或获取的共享锁。
意向排他 (IX) 保护针对层次结构中某些(而并非所有)低层资源请求或获取的排他锁。IX 是 IS 的超集,它也保护针对低层级别资源请求的共享锁。 意向排他共享 (SIX) 保护针对层次结构中某些(而并非所有)低层资源请求或获取的共享锁以及针对某些(而并非所有)低层资源请求或获取的意向排他锁。顶级资源允许使用并发 IS 锁。例如,获取表上的 SIX 锁也将获取正在修改的页上的意向排他锁以及修改的行上的排他锁。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其他事务对资源进行更新,但是其他事务可以通过获取表级的 IS 锁来读取层次结构中的低层资源。 意向更新 (IU) 保护针对层次结构中所有低层资源请求或获取的更新锁。仅在页资源上使用 IU 锁。如果进行了更新操作,IU 锁将转换为 IX 锁。 共享意向更新 (SIU) S 锁和 IU 锁的组合,作为分别获取这些锁并且同时持有两种锁的结果。例如,事务执行带有 PAGLOCK 提示的查询,然后执行更新操作。带有 PAGLOCK 提示的查询将获取 S 锁,更新操作将获取 IU 锁。 更新意向排他 (UIX) U 锁和 IX 锁的组合,作为分别获取这些锁并且同时持有两种锁的结果。架构锁 数据库引擎在表数据定义语言 (DDL) 操作(例如添加列或删除表)的过程中使用架构修改 (Sch-M) 锁。保持该锁期间,Sch-M 锁将阻止对表进行并发访问。这意味着 Sch-M 锁在释放前将阻止所有外围操作。某些数据操作语言 (DML) 操作(例如表截断)使用 Sch-M 锁阻止并发操作访问受影响的表。数据库引擎在编译和执行查询时使用架构稳定性 (Sch-S) 锁。Sch-S 锁不会阻止某些事务锁,其中包括排他 (X) 锁。因此,在编译查询的过程中,其他事务(包括那些针对表使用 X 锁的事务)将继续运行。但是,无法针对表执行获取 Sch-M 锁的并发 DDL 操作和并发 DML 操作。
大容量更新锁 数据库引擎在将数据大容量复制到表中时使用了大容量更新 (BU) 锁,并指定了 TABLOCK 提示或使用 sp_tableoption 设置了 table lock on bulk load 表选项。大容量更新锁(BU 锁)允许多个线程将数据并发地大容量加载到同一表,同时防止其他不进行大容量加载数据的进程访问该表。
键范围锁 在使用可序列化事务隔离级别时,对于 Transact-SQL 语句读取的记录集,键范围锁可以隐式保护该记录集中包含的行范围。键范围锁可防止幻读。通过保护行之间键的范围,它还防止对事务访问的记录集进行幻像插入或删除。