Sql Server锁的粒度
Sql Server锁的粒度锁的粒度就是指锁的生效范围,就是说是行锁,还是页锁,还是整表锁. 锁的粒度同样既可以由数据库自动管理,也可以通过手工指定hint来管理。
为描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求
一、页锁实例
T1: select * from table (paglock)
T2: update table set column1='hello' where id>10
说明
T1执行时,会先对第一页加锁,读完第一页后,释放锁,再对第二页加锁,依此类推。假设前10行记录恰好是一页(当然,一般不可能一页只有10行记录),那么T1执行到第一页查询时,并不会阻塞T2的更新。
二、行锁实例
T1: select * from table (rowlock)
T2: update table set column1='hello' where id=10
说明
T1执行时,对每行加共享锁,读取,然后释放,再对下一行加锁;T2执行时,会对id=10的那一行试图加锁,只要该行没有被T1加上行锁,T2就可以顺利执行update操作。
三、整表锁实例
T1: select * from table (tablock)
T2: update table set column1='hello' where id = 10
说明
T1执行,对整个表加共享锁. T1必须完全查询完,T2才可以允许加锁,并开始更新。
以上3例是手工指定锁的粒度,也可以通过设定事物隔离级别,让数据库自动设置锁的粒度。不同的事物隔离级别,数据库会有不同的加锁策略。