В этом случае вам необходимо использовать REPEATABLE READ
уровень изоляции. С READ COMMITTED
другая транзакция может изменить вашу запись.
Если вы можете переписать свою логику в 1 запросе (например, с помощью update
или merge
), вы все равно можете использовать READ COMMITTED
. Но иногда это не вариант. Например,
SELECT ... ;
IF some_condition
BEGIN
// execute a procedure, select from other tables, etc
END
ELSE
BEGIN
// execute another procedure, do some other stuff
END;
// finally update the record
UPDATE ....
Обновление
Есть еще одна опция, о которой я забыл упомянуть: используйте табличную подсказку REPEATABLEREAD
в своем SELECT
выражении ( Подробнее см. )