【问题标题】:With(XLock,RowLock) does not lock row exclusivelyWith(XLock,RowLock) 不会独占锁定行
【发布时间】:2011-06-22 18:36:31
【问题描述】:

我有一个表,其中有一列名为“Is_Locked”。

我打开 2 个 SSMS 并在每个 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 语句都不会独占锁定行。

为什么?

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 2017-09-07
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2012-01-30
      相关资源
      最近更新 更多