SQL Server соответствует строгому определению Сериализуемого запроса.То есть должен быть результат, который может быть логически сгенерирован IF , оба запроса выполняются в последовательном порядке - транзакция 1 завершается до начала транзакции 2, или наоборот.
Это приводит к некоторымэффекты, которые могут отличаться от ожидаемых.На уровне SQLPerformance.com есть отличное объяснение уровня изоляции Serializable, в котором разъясняется, что в действительности означает эта логическая сериализуемость.(Очень полезный сайт, вот этот.)
Для ваших вышеупомянутых запросов нет логического требования запрещать второму запросу читать ту же строку, что и первый запрос.Независимо от того, в каком порядке выполняются запросы, они оба будут возвращать одни и те же данные без их изменения.Поскольку Query Analyzer может идентифицировать это, нет никаких причин устанавливать блокировку чтения данных.Однако, если один из запросов произвел обновление данных, то (предупреждение - логическое предположение здесь, поскольку я на самом деле не знаю, как SQL Server это обрабатывает), QA установит более сильную блокировку для выбранных строк.
TL; DR - SQL Server хочет минимизировать блокировку, поэтому он использует логический анализ, чтобы увидеть, какие типы блокировок необходимы для сериализуемого уровня изоляции, и он (пытается) использовать минимальное количество и силу блокировокнужно для достижения своей цели.
Теперь, когда мы с этим справились - есть только два способа, которыми я могу придумать, чтобы заблокировать строку, чтобы никто не мог ее прочитать: использование XLOCK + TABLOCK (блокировкався таблица - не рекомендуемая практика) или наличие какой-либо формы поля в каждой строке, которое обновляется при запуске процесса - что-то вроде поля SPID или битового флага для Locked.Когда вы обновляете его в своей транзакции, только SELECT с подсказками NOLOCK смогут прочитать его.
Ясно, что ни один из них не является оптимальным.Я рекомендую флаг «Эта строка занята - уходи», так как это, вероятно, подход, который я бы использовал для (почти) абсолютной блокировки строки.