锁模式
锁模式 |
说明 |
---|---|
共享 (S) |
用于不更改或不更新数据的读取操作,如 SELECT 语句。 |
更新 (U) |
用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 |
排他 (X) |
用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。 |
意向 |
用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。 |
架构 |
在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 |
大容量更新 (BU) |
在向表进行大容量数据复制且指定了 TABLOCK 提示时使用。 |
键范围 |
当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。 |
锁的粒度
资源 |
说明 |
---|---|
RID |
用于锁定堆中的单个行的行标识符。 |
KEY |
索引中用于保护可序列化事务中的键范围的行锁。 |
PAGE |
数据库中的 8 KB 页,例如数据页或索引页。 |
EXTENT |
一组连续的八页,例如数据页或索引页。 |
HoBT |
堆或 B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁。 |
TABLE |
包括所有数据和索引的整个表。 |
FILE |
数据库文件。 |
APPLICATION |
应用程序专用的资源。 |
METADATA |
元数据锁。 |
ALLOCATION_UNIT |
分配单元。 |
DATABASE |
整个数据库。 |
用rowlock实现行锁
--连接一
begin tran
select * from B with(rowlock,holdlock)--加上行锁
where id=1
waitfor delay '00:01:00'--等待60秒提交事务
commit tran
--连接二
update B
set name='a1'
where id=1--会堵塞 update B
set name='a1'
where id=2--不会堵塞
要实现表的行锁,必须要有主键,因为行锁只能运用于主键,没有主键的话只能是表锁。