Общие блокировки, принятые в соответствии с Read Committed Snapshot Isolation (RCSI)


9

Я вижу ожидания общих блокировок ( LCK_M_S) при использовании RCSI. SELECTsНасколько я понимаю, это не должно происходить, так как не требуют общих блокировок при использовании RCSI.

Как я могу увидеть общие блокировки? Это из-за внешних ключей?


Могу ли я также спросить, устанавливает ли сервер sql общие блокировки на записи, если нет индекса, даже если read_committed_snapshot включен?
grassbl8d

Ответы:


13

Как я могу увидеть общие блокировки? Это из-за внешних ключей?

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

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

Если SQL Server этого не сделает, операторы изменения данных в разделе RCSIмогут в конечном итоге нарушить ограничение внешнего ключа, поскольку проверка целостности использует устаревшие (версионные) данные.

К сожалению, в настоящее время нет поддерживаемого способа увидеть это изменение в поведении блокировки в плане выполнения. Можно увидеть подсказки внутренней блокировки, когда флаг трассировки 8607 активен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.