В SQL Server, как я могу заблокировать одну строку способом, аналогичным Oracle «SELECT FOR UPDATE WAIT»?

У меня есть программа, которая подключается к базе данных Oracle и выполняет операции с ней. Теперь я хочу адаптировать эту программу для поддержки базы данных SQL Server.

В версии Oracle я использую «SELECT FOR UPDATE WAIT» для блокировки определенных нужных мне строк. Я использую его в ситуациях, когда обновление основано на результате SELECT, и другие сеансы могут абсолютно не изменять его одновременно, поэтому они должны сначала заблокировать его вручную. Система сильно подвержена сеансам, пытающимся получить доступ к одним и тем же данным одновременно.

Например:
Два пользователя пытаются извлечь строку в базе данных с наивысшим приоритетом, пометить ее как занятую, выполнить над ней операции и снова пометить как доступную для дальнейшего использования. В Oracle логика будет выглядеть примерно так:

BEGIN TRANSACTION;
SELECT ITEM_ID FROM TABLE_ITEM WHERE ITEM_PRIORITY > 10 AND ITEM_CATEGORY = 'CT1'
    ITEM_STATUS = 'available' AND ROWNUM = 1 FOR UPDATE WAIT 5;
UPDATE [locked item_id] SET ITEM_STATUS = 'unavailable';
COMMIT TRANSACTION;

Обратите внимание, что запросы строятся динамически в моем коде. Также обратите внимание, что когда ранее наиболее благоприятная строка помечается как недоступная, второй пользователь автоматически переходит к следующей и так далее. Кроме того, разные пользователи, работающие в разных категориях, не должны будут ждать разблокировки друг друга. В худшем случае - через 5 секунд будет возвращена ошибка и операция будет отменена.

Итак, наконец, вопрос: как мне добиться таких же результатов в SQL Server? Я искал подсказки блокировки, которые, теоретически, кажутся, что они должны работать. Однако единственными блокировками, которые предотвращают другие блокировки, являются «UPDLOCK» И «XLOCK», которые работают только на уровне таблицы.
Те подсказки блокировки, которые работают на уровне строк, являются общими блокировками, которые также не удовлетворяют моим потребностям (оба пользователя могут блокировать одну и ту же строку одновременно, оба помечают ее как недоступную и выполняют избыточные операции с соответствующим элементом).

Некоторые люди, кажется, добавляют столбец «измененного времени», чтобы сеансы могли убедиться, что именно они изменили его, но это звучит так, как если бы было много избыточных и ненужных обращений.

Ответы на вопрос(4)

Ваш ответ на вопрос