遇到一个锁的问题,请教大家。
表:
table1
id userid status
1  11      4
2  12      5
3  13      6
....
---------------------------------------存储过程-------------------------------------
CREATE PROCEDURE test
@UserID int
AS
SET NOCOUNT ON;
begin tran
select * from dbo.table1 with (UPDLOCK,ROWLOCK) where UserID=@UserID;
waitfor delay '00:00:05'--增加这句可以更快出现死锁
update dbo.table1 set status=4 where userid=@UserID;
commit
GOSET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
--------------------------------------------------------------------------------------------------------打开一个查询窗口
while(1=1)
begin
exec test 11
end打开另一个查询窗口
while(1=1)
begin
exec test 12
end运行以后会出现死锁错误。为了更快出错,可以多开几个窗口,每个窗口的程序要用不同的条件参数
数据库用的是 sqlserver2005
如果把表提示改为,(XLOCK,TABLOCK)  (XLOCK,HOLDLOCK,TABLOCK) 都会出现死锁。
(UPDLOCK,HOLDLOCK,ROWLOCK)不会出现死锁
这让我非常疑惑,根据帮助,我认为只要使用(UPDLOCK)就可以,请高人指点

解决方案 »

  1.   

    XLOCK,TABLOCK),Xlock是排他锁,也就是加了锁以后就不能再加其他的锁了,Tablock是对表进行加锁rowlock是对行进行加锁,封锁的粒度比较小
      

  2.   

    谢谢楼上的回答,但是没有解决我的问题。
    UPDLOCK,在帮助中的解释是:指定采用更新锁并保持到事务完成。我自己写脚本测试,发现这是正确的,先获得更新锁的事务会阻断其他要获得更新锁的事务
    但是在并发运行上面的存储过程的时候,却出现了死锁。
    这让我很困惑。