Я вижу ожидания общих блокировок ( LCK_M_S
) при использовании RCSI. SELECTs
Насколько я понимаю, это не должно происходить, так как не требуют общих блокировок при использовании RCSI.
Как я могу увидеть общие блокировки? Это из-за внешних ключей?
Я вижу ожидания общих блокировок ( LCK_M_S
) при использовании RCSI. SELECTs
Насколько я понимаю, это не должно происходить, так как не требуют общих блокировок при использовании RCSI.
Как я могу увидеть общие блокировки? Это из-за внешних ключей?
Ответы:
Как я могу увидеть общие блокировки? Это из-за внешних ключей?
Да. SQL Server возвращается к реализации блокировки уровня изоляции зафиксированного чтения при доступе к таблице с целью проверки ограничений внешнего ключа. Это необходимо для правильности и не может быть отключено.
Поведение применяется только к операторам изменения данных. Общие блокировки принимаются только при проверке данных, связанных с внешним ключом. Другие данные доступа в том же плане выполнения могут продолжать использовать управление версиями строк.
Если SQL Server этого не сделает, операторы изменения данных в разделе RCSI
могут в конечном итоге нарушить ограничение внешнего ключа, поскольку проверка целостности использует устаревшие (версионные) данные.
К сожалению, в настоящее время нет поддерживаемого способа увидеть это изменение в поведении блокировки в плане выполнения. Можно увидеть подсказки внутренней блокировки, когда флаг трассировки 8607 активен.