Когда в электронной документации по SQL Server написано, что
«Общие (S) блокировки ресурса освобождаются , как только операция чтения завершается , если только уровень изоляции транзакции не установлен на повторяемое чтение или выше, или не используется подсказка блокировки сохранить общие (S) блокировки на время транзакции. "
Предполагая, что речь идет о блокировке на уровне строк без явной транзакции на уровне изоляции по умолчанию (Read Committed), что означает « операция чтения »?
- Чтение одной строки данных?
- Чтение одной 8k IO Page?
- или до тех пор, пока не завершится выполнение полного оператора Select, в котором была создана блокировка, независимо от количества других строк
участие?
ПРИМЕЧАНИЕ. Причина, по которой мне нужно это знать, заключается в том, что у нас есть несколько вторых операторов выбора только для чтения, сгенерированных веб-службой уровня данных, которая создает общие блокировки чтения на уровне страницы, создавая взаимоблокировку из-за конфликта с уровнем строки эксклюзивное обновление блокируется от процесса репликации, который поддерживает обновление сервера. Оператор выбора довольно большой, со множеством подвыборов, и один администратор БД предлагает переписать его, чтобы разбить его на несколько более мелких операторов (более короткие ходовые части), «чтобы сократить продолжительность удержания блокировок». Поскольку это предполагает, что общие блокировки чтения удерживаются до завершения полного оператора выбора, если это неправильно (если блокировки снимаются, когда строка или страница читаются), тогда этот подход не будет иметь никакого эффекта ...