SQL Server: атомарное обновление в совершенном чтении, может обнаружить одновременную запись? - PullRequest
0 голосов
/ 05 марта 2019

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

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'

Когда UPDATE WHERE читает столбец Баланс, гарантированно ли он прочитал зафиксированный или считал грязнымнаписать еще одну открытую транзакцию?Другими словами, могу ли я обнаружить потерянное обновление, используя READ COMMITTED и проверив, оказало ли мое обновление какое-либо влияние или нет.

1 Ответ

0 голосов
/ 05 марта 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...