Я хочу реализовать атомную транзакцию следующим образом:
BEGIN TRAN A
SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10
/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than 10).
*/
COMMIT TRAN A
Проблема заключается в том, что происходят другие транзакции, которые потребляют количество из нашего инвентаря, поэтому между временем, когда запись выбрана, и обновления записываются в транзакции A, эта запись может стать недопустимым выбором, поскольку количество может быть уменьшено ниже порога в предложении WHERE.
Итак, вопрос в том, какие блокирующие подсказки следует использовать в предложении WITH, чтобы предотвратить изменение выбранной записи инвентаря до того, как я закончу свои обновления и сделаю транзакцию?
EDIT: Поэтому, благодаря Джону, хорошим решением является установка уровня изоляции транзакций на REPEATABLE READ. Это позволит убедиться, что "никакие другие транзакции не могут изменять данные, которые были прочитаны текущей транзакцией, до завершения текущей транзакции".