Насколько я понимаю, оператор SELECT установит общую блокировку на строки, которые он вернет. Во время выполнения этого SELECT, если появляется оператор UPDATE и ему необходимо захватить намеренную монопольную блокировку, тогда этому оператору UPDATE потребуется дождаться, пока оператор SELECT не снимет свои общие блокировки.
Я пытаюсь проверить эту общую блокировку SELECT, выполнив BEGIN TRAN, а затем выполнив SELECT, а не COMMITing, а затем запустив UPDATE в другом сеансе в той же строке. ОБНОВЛЕНИЕ прошло нормально - без блокировки, без ожидания. Значит, это не должен быть допустимым способом имитации разделяемой блокировки, блокирующей намеренную эксклюзивную блокировку? Можете ли вы дать мне сценарий, в котором я могу создать блокировку с помощью SELECT, которая заставит UPDATE ждать?
Я работаю с SQL Server 2000 и 2005 через связанный сервер: таблица находится в экземпляре 2005 года, выбор выполняется в 2000 году, а обновление выполняется с 2005 года. Все в SSMS 2005.
Вы можете изменить уровни изоляции с READ COMMITTED на REPEATABLE READ или SERIALIZABLE для принудительной блокировки.