22,301
社区成员




1.
连接一
begin tran
select * from t with(xlock)
连接二
select * from t
连接二的select不受连接一的排他锁影响
----------------------------------------------
2.
连接一
begin tran
update t set a=a
连接二
select * from t
连接二的select不受连接一的排他锁影响
----------------------------------------------
看上去两个语句好像没有加排他锁,执行SP_LOCK,可以看到,X锁已经成功加上,为什么select语句不受影响?
Sql Server在执行READ_COMMITTED时会优化行级锁,如果它能确定锁不影响读出正确结果,锁就会被忽略掉。
不准确的说,当sql server在读取时知道该页未被修改,就会读取数据,而忽略掉X锁。
那select时怎么才能让其他人读取不到数据呢?
要使用页级的X锁,因为页的X锁与页的IS锁不兼容
begin tran
select * from t with(xlock,paglock)