这个锁很奇怪

xiaotugege 2009-03-07 05:23:42
做了个小实验

给select添加一个行集排他锁
begin tran
select * from stuscore with(xlock,rowlock) where examno='s271811'
waitfor delay '00:00:30'
rollback
然后开启另一个查询分析器
begin tran
select * from stuscore where examno='s271811'
rollback

奇怪的事情发生了,排他锁完全没有起作用.
这是为什么呢?请教!
...全文
108 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不准确的说,当sql server在读取时知道该页未被修改,就会读取数据,而忽略掉X锁。
如果你对数据进行修改的话,那么第二是执行不了的
htl258_Tony 2009-03-07
  • 打赏
  • 举报
回复
关注..
nzperfect 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaotugege 的帖子:]
做了个小实验

给select添加一个行集排他锁
begin tran
select * from stuscore with(xlock,rowlock) where examno='s271811'
waitfor delay '00:00:30'
rollback
然后开启另一个查询分析器
begin tran
select * from stuscore where examno='s271811'
rollback

奇怪的事情发生了,排他锁完全没有起作用.
这是为什么呢?请教!
[/Quote]

请使用paglock
with(xlock,paglock)

目前sql server 无法真正实现这种行级排它锁。
lgx0914 2009-03-07
  • 打赏
  • 举报
回复
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)
zjh222 2009-03-07
  • 打赏
  • 举报
回复
另一个查询分析器就是另一个进程了,

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧