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

9

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

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

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

Ответы:

13

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

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

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

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

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

Пол Уайт 9
источник