使用(XLock,RowLock)不会独占锁定行

时间:2011-06-22 18:36:31

标签: sql sql-server sql-server-2005 sql-server-2008 transactions

我有一个名为“Is_Locked”的列。

我打开2个SSMS,每个人都用这个脚本创建一个新的查询:

BEGIN TRAN Nima1 
BEGIN TRY
    DECLARE @a INT

    SELECT @a=COUNT(*) 
    FROM   dbo.Siahe WITH(XLOCK,ROWLOCK)  
    WHERE  TedadDaryaii=8 
           AND Is_Locked=1

     IF @a = 0
     BEGIN
       UPDATE Siahe
       SET    Is_Locked = 1
       WHERE  ShMarja = 9999
     END

COMMIT TRAN Nima1
END TRY
BEGIN CATCH
     ROLLBACK TRAN Nima1
END CATCH

但是如果所有Is_Lock字段都是 false ,那么查询执行和Select语句都不会独占锁定行。

为什么?

1 个答案:

答案 0 :(得分:1)

如果@a = 0,则第一个查询中有0个匹配的行。这些行中的所有0个都是独占锁定的。我对你的select和update语句中的不同条件感到有些困惑。如果在两者中都使用相同的条件,我建议如下:

UPDATE Siahe
SET    Is_Locked = 1
WHERE
      Is_Locked = 0 and
      /* Other Conditions */

IF @@ROWCOUNT = 1
BEGIN
    PRINT 'We got the lock'
END
ELSE
BEGIN
    PRINT 'Someone else has the lock'
END