Я хочу реализовать атомарную транзакцию, подобную следующей:
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. Это гарантирует, что «никакие другие транзакции не могут изменять данные, прочитанные текущей транзакцией, до тех пор, пока текущая транзакция не завершится».