高手请进,ROWLOCK XLOCK 无法锁定行的问题

gxh973121 2006-03-16 01:48:07
有表ticket 如下
ID trainNO Price ISSaleOut
--------- ----------- ----------- -----------
BH000001 AI0001 50 0
BH000002 AI0001 50 0
BH000003 AI0001 50 0

打开两个数据库连接1,2
在连接1中执行

begin tran
select * from ticket WITH (ROWLOCK XLOCK) where id='BH000001'
waitfor delay '00:00:10'
commit

然后再在连接2中执行
begin tran
select * from ticket
commit

连接2 立刻返回了全部数据 包括1 中 我已加了XLOCK 的 ID 为 'BH000001'

我想请问为什么我在 连接1中 加了排他锁的 ID 为 'BH000001'的记录在连接2
中还能读取




...全文
366 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxh973121 2006-03-16
  • 打赏
  • 举报
回复
大部分明白了,但有些还有点模糊,不过先散分了
wudan8057 2006-03-16
  • 打赏
  • 举报
回复
将第二个连接改为:
begin tran
select * from authors WITH (updlock readpast)
commit
gxh973121 2006-03-16
  • 打赏
  • 举报
回复
去掉xlock 结果不一样,会把所有数据都选出来
wudan8057 2006-03-16
  • 打赏
  • 举报
回复
你可以将连接2的xlock去掉,结果是样的.
prcgolf 2006-03-16
  • 打赏
  • 举报
回复
up
gxh973121 2006-03-16
  • 打赏
  • 举报
回复
TO wudan8057:
你的执行结果看起来确实是我想要的,但是在连接2 中好象又对au_id ='172-32-1176' 以外的所有记录加了xLOCK, 我想要在连接2中 只选出除加了X锁的 au_id ='172-32-1176' 以外的记录,但不对这些记录加X,请教
lsqkeke 2006-03-16
  • 打赏
  • 举报
回复
同意楼上
wudan8057 2006-03-16
  • 打赏
  • 举报
回复
改为:
在连接1中执行
begin tran
select * from authors WITH (ROWLOCK XLOCK readpast) where au_id='172-32-1176'
waitfor delay '00:00:10'
commit
在连接2中执行
begin tran
select * from authors WITH (ROWLOCK XLOCK readpast)
commit
gxh973121 2006-03-16
  • 打赏
  • 举报
回复
to 萧萧:
而且,我用 WITH (ROWLOCK XLOCK),不是加 行级X锁吗
gxh973121 2006-03-16
  • 打赏
  • 举报
回复
to 萧萧:
用TABLOCKX 会把整个表锁住,我只想在ID ='BH000001'的这一条记录上加排他锁
也就是说 连接2 中 可以选出ID != 'BH000001' 的任何记录
zlp321002 2006-03-16
  • 打赏
  • 举报
回复
--注意S是共享锁,X是排它锁

在连接1中执行

begin tran
select * from ticket with(TABLOCKX) where id='BH000001'
waitfor delay '00:00:10'
commit

然后再在连接2中执行
begin tran
select * from ticket
commit

22,300

社区成员

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

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