日期:2014-05-17  浏览次数:20632 次

明明写的是更新锁怎么变成排斥锁了?
SQL code

begin tran 

select * from a with (updlock, tablock, holdlock)  where t1=3

waitfor delay '00:00:18'


commit tran



在查询分析器执行后, 再打开一个新连接, 发现select 查询语句也卡住了.
用企业管理器查看当前锁状态, 发现是 X模式的 排斥锁.
我写的有什么问题吗
sql server 2000的数据库

------解决方案--------------------
更新当然要排他

------解决方案--------------------
SQL code
友情帮顶.蹭分

------解决方案--------------------
更新就是X或IX锁!
------解决方案--------------------
tablock锁定整个表
updlock更新锁,本来允许其他共享锁的,但是由于表所存在,实际就不再允许其他的共享锁了
holdlock这是个保持所的概念,就是多有的锁保持到事务结束

这三个组合,系统应该自动升级为拍他的表锁,事务结束前这个表不允许其他任何操作。

------解决方案--------------------
要先申请到排他(IX锁和X锁)才能进行更新(U锁)的呀.

------解决方案--------------------
再打开一个新连接, 发现select 查询语句也卡住了.

另一个连接用with(nolock)查询试试

------解决方案--------------------
看看这个 :
http://blog.csdn.net/arrow_gx/archive/2009/03/19/4004938.aspx
------解决方案--------------------
你不是有updlock这个么。。。那么就会有X或IX
------解决方案--------------------
探讨
引用:
tablock锁定整个表
updlock更新锁,本来允许其他共享锁的,但是由于表所存在,实际就不再允许其他的共享锁了
holdlock这是个保持所的概念,就是多有的锁保持到事务结束

这三个组合,系统应该自动升级为拍他的表锁,事务结束前这个表不允许其他任何操作。


对整个表使用更新锁, 应该允许其他线程执行select进行读取的吧.

------解决方案--------------------
"当使用更新锁的时候, 其他线程的事务应该也可以获得共享锁来进行读取操作的"

--> 不是这样的吧大哥,别尽信书(或者理解不当),测试一下就知道了.
------解决方案--------------------
TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据,直到这个语句或整个事务结束。

楼主你不是已经用了排它了么,另一个select会在18秒后显示。
------解决方案--------------------
额。看错,楼主你这样看看!

SQL code

select * from a with (updlock, tablock, holdlock)  where t1=3

exec sp_lock

select @@spid

waitfor delay '00:00:02'

------解决方案--------------------
留名~学习
------解决方案--------------------
探讨
更新就是X或IX锁!