#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, другая транзакция может добавлять другую сумму. но даже в этом случае, я думаю, ответ тот же, я мог бы использовать одно обновление. Спасибо