У меня есть процесс, который запускает транзакцию, вставляет запись в таблицу Table1, а затем вызывает долго работающий веб-сервис (до 30 секунд). Если вызов веб-службы завершается неудачно, вставка откатывается (что мы и хотим). Вот пример вставки (на самом деле это несколько вставок в несколько таблиц, но я упрощаю этот вопрос):
INSERT INTO Table1 (UserId, StatusTypeId) VALUES (@UserId, 1)
У меня есть второй процесс, который запрашивает Table1 с первого шага, как это:
SELECT TOP 1 * FROM Table1 WHERE StatusTypeId=2
, а затем обновляет эту строку для пользователя. Когда процесс 1 запущен, Table1 заблокирован, поэтому процесс 2 не будет завершен до тех пор, пока не завершится процесс 1, что является проблемой, поскольку вводится длительная задержка, в то время как процесс 1 завершает свой вызов веб-службы.
Процесс 1 будет всегда вставлять StatusTypeId только 1, и это также единственная операция, которая вставляется в Table1. Процесс 2 будет запрашивать только при StatusTypeId = 2. Я хочу сказать, чтобы Процесс 2 игнорировал любые вставки в Таблицу 1, но блокировал выбранную строку. Уровень изоляции по умолчанию для Процесса 2 слишком велик, но у меня есть опасение, что IsolationLevel.ReadUncommitted позволяет читать слишком много грязных данных. Я не хочу, чтобы два пользователя запускали процесс 2, а затем случайно получали одну и ту же строку.
Существует ли другой IsolationLevel для использования, отличный от ReadUncommitted, который говорит, что игнорирует вставленные строки, но удостоверится, что select блокирует выбранную строку?