С (XLock, RowLock) не блокирует строки исключительно - PullRequest
0 голосов
/ 22 июня 2011

У меня есть таблица, в которой есть столбец с именем «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 Ответ

1 голос
/ 23 июня 2011

Если @a = 0, то в вашем первом запросе было 0 подходящих строк.Все 0 из этих строк исключительно заблокированы.Меня немного смущают ваши разные условия where в ваших операторах 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...