Почему уровень изоляции «read uncommited» разрешает блокировки?

Я поставил точку останова в своем коде, чтобы приостановить выполнение до того, как транзакция будет зафиксирована или отменена. Затем я хотел бы увидеть текущее состояние базы данных, но когда я устанавливаю в ssms уровень изоляции транзакции read uncommited и запускаю запрос к таблицам, затронутым приостановленной транзакцией, он блокируется и ждет завершения транзакции.

Почему так происходит, и можно ли отключить блокировку?


person Pavel Voronin    schedule 18.03.2015    source источник
comment
Какова природа транзакции, которую вы приостановили? Вносит ли он изменения в схему? (Поскольку, если схема изменяется, новый запрос не может быть скомпилирован)   -  person Damien_The_Unbeliever    schedule 18.03.2015
comment
@Damien_The_Unbeliever хорошо, включение и выключение ограничений после вставки. (скрипт загрузки данных для интеграционного теста)   -  person Pavel Voronin    schedule 18.03.2015
comment
@Damien_The_Unbeliever Не могли бы вы написать это как ответ, а не как комментарий?   -  person Pavel Voronin    schedule 18.03.2015


Ответы (1)


Мой хрустальный шар сказал мне, что транзакция, которую вы приостановили, внесла изменения в схему.

Такие модификации снимают [блокировки модификации схемы] (Sch-M)(https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396):

Это означает, что замок Sch-M блокирует все внешние операции до тех пор, пока замок не будет снят.

И это включает даже возможность компилировать ваш read uncommitted с помощью запроса, потому что:

Компонент Database Engine использует блокировки стабильности схемы (Sch-S) при компиляции и выполнении запросов.

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

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

person Damien_The_Unbeliever    schedule 18.03.2015