SQL Server: атомарное обновление при фиксированном чтении, может обнаружить параллельную запись?

#sql-server #transaction-isolation

#sql-server #транзакция-изоляция

Вопрос:

Если у меня есть параллельные транзакции, использующие уровень изоляции чтения, зафиксированного, и тело транзакции выглядят следующим образом:

 DECLARE @value..

SELECT @value = balance
FROM MyTable
WHERE Account = 1

UPDATE MyTable
SET balance = @value @pAmount
WHERE Account = 1 AND Balance = @value

IF @@COUNT == 0 
    THROW 'another transaction changed'
  

Когда обновление WHERE считывает столбец баланса, гарантированно ли оно считывает зафиксированное или оно считывает грязную запись другой открытой транзакции? Другими словами, могу ли я обнаружить потерянное обновление, используя зафиксированное ЧТЕНИЕ и проверяя, оказало ли мое обновление какой-либо эффект или нет.

Ответ №1:

Поскольку @value кажется скалярной переменной, я считаю, что вы можете выполнить всю свою логику всего одним обновлением:

 UPDATE MyTable
SET balance = balance   1
WHERE Account = 1;
  

Причина этого в том, что @value всегда должен быть только текущий баланс первой учетной записи.

Комментарии:

1. спасибо, я обновил пример. вместо того, чтобы всегда добавлять 1, другая транзакция может добавлять другую сумму. но даже в этом случае, я думаю, ответ тот же, я мог бы использовать одно обновление. Спасибо