Я попытался воспроизвести ситуацию вопроса [1].
В таблице взяты и заполнены данными из вики "Изоляция (системы баз данных)" [2],
в SQL Server 2008 R2 SSMS я выполнил:
1) сначала в первой вкладке (окне) SSMS
-- transaction isolation level in first window does not influence results (?)
-- initially I thought that second transaction in 2) runs at the level set in first window
begin transaction
INSERT INTO users VALUES ( 3, 'Bob', 27 )
waitfor delay '00:00:22'
rollback
2) сразу после, во втором окне
-- this is what I commented/uncommented
-- set transaction isolation level SERIALIZABLE
-- set transaction isolation level READ REPEATABLE
-- set transaction isolation level READ COMMITTED
-- set transaction isolation level READ UNCOMMITTED
SELECT * FROM users --WITH(NOLOCK)
Обновление:
Извините, результаты были исправлены.
Мои результаты, в зависимости от уровня изоляции, установленного в 2), заключаются в том, что SELECT возвращает:
немедленно (чтение незафиксированной вставленной строки)
ожидает завершения транзакции 1) ( ONLY IF SELECT без NOLOCK) и
Эти результаты противоречат ситуации, описанной в вопросе (и объясненной в ответах?) [1]
(например, SELECT с NOCHECK ожидает завершения 1)) и т. д.
Как можно объяснить мои результаты и [1]?
Обновление 2:
Этот вопрос на самом деле является подвопросом моих вопросов [3] (или результатом отсутствия на них ответа).
Процитировано:
[1]
Объяснение поведения блокировки в SQL Server
Объяснение поведения блокировки в SQL Server
[2]
«Изоляция (системы баз данных)»
Пожалуйста, добавьте трейлинг) в ссылку. Я не могу сохранить его здесь, по ссылке!
http://en.wikipedia.org/wiki/Isolation_ (database_systems)
[3]
Является ли NOLOCK значением по умолчанию для операторов SELECT в SQL Server 2005?
Является ли NOLOCK значением по умолчанию для операторов SELECT в SQL Server 2005?