является транзакцией sql server - PullRequest
       7

является транзакцией sql server

7 голосов
/ 15 сентября 2011

поэтому у меня есть хранимая процедура (sql server 2008 r2) примерно так

BEGIN TRAN
BEGIN TRY


   //critical section
    select value        
    update value
       //end of critical section


    COMMIT
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

Я не хочу, чтобы две хранимые процедуры читали одно и то же значение.Другими словами, чтение и обновление должны быть атомарными.Этот код делает это?Если нет, то как мне это сделать?

1 Ответ

6 голосов
/ 15 сентября 2011

Да, они атомарные, но это не значит, что вы получите то поведение, которое вам здесь нужно!Свойство, на которое нужно обратить внимание, - это изоляция.

Чтобы добиться требуемого исключения, вам нужно будет выполнить операцию SELECT для единственного значения , взаимно исключающего .Вы можете сделать это, запросив блокировку Update (убедитесь, что предикат WHERE можно найти по индексу, чтобы избежать блокировки ненужных лишних строк)

SELECT * FROM foo WITH(ROWLOCK,UPDLOCK) WHERE bar='baz'

Обратите внимание, что эта блокировка будет сохраняться до вашей транзакцииКоммиты, однако, не публикуются в конце критического раздела, но это всегда будет так, если вы все равно обновили значение.

...