0

"Is_Locked"という名前の列を持つテーブルがあります。(XLock、RowLock)は行を排他的にロックしません

私は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フィールドはされている場合は、両方のクエリを実行し、SELECT文が独占的に行をロックしません。

なぜですか?

答えて

1

@a = 0の場合、最初のクエリに一致する行が0件あります。それらの行の0つすべてが排他的にロックされます。私はちょっとあなたの選択と更新ステートメントの異なる条件で混乱しています。両方で条件が使用された場所が同じ場合は、次のようなものをお勧めします。

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 
関連する問題