高手请进,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
中还能读取




...全文
284 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2006-03-16 01:48
社区公告
暂无公告