Если клиенту требуется много времени для получения данных и, в свою очередь, для отправки SQL Server подтверждения того, что он получил данные, SQL Server должен ждать, из-за этого ожидания SQL Server не снимет блокировки, удерживаемые запросом, если подтверждение не получено от клиента.
Это не точно, это зависит от уровня изоляции.
По умолчанию READ COMMITTED
блокировки не удерживаются на время выполнения операторов. READ COMMITTED
не обеспечивает согласованность чтения на уровне выписки, единственная гарантия состоит в том, что вы не можете прочитать непереданные данные. Общая блокировка получается и удерживается для чтения строки, а затем освобождается.
Если у вас нет типов LOB.
Типы больших объектов, потенциально очень большие, не могут быть помещены в буфер. Общая блокировка должна быть получена и удерживаться до завершения инструкции, что по сути дает вам REPEATABLE READ
поведение в READ COMMITTED
.
Если я делаю один вызов к базе данных MSSQL по сети с высокой задержкой, произойдут ли блокировки таблицы из-за этой задержки?
Задержка не вызывает блокировку таблицы, нет. Однако, если блокировка таблицы была получена, задержка увеличит ее.
Процитирую кого-то, кто знает механизм этого лучше меня ( @RemusRusanu ):
Результаты возвращаются клиентской программе по мере выполнения. Когда строки «всплывают» в дереве выполнения, перед главным оператором обычно ставится задача записать эти строки в сетевые буферы и отправить их обратно клиенту. Результат не создается сначала в какое-то промежуточное хранилище (память или диск), а затем отправляется обратно клиенту, вместо этого он отправляется обратно в процессе создания (при выполнении запроса). Отправка результата обратно клиенту, конечно, зависит от протокола управления сетевым потоком. Если клиент активно не потребляет результат (например, путем вызова SqlDataReader.Read ()), то в конечном итоге управление потоком данных должно будет заблокировать отправляющую сторону (выполняемый запрос), и это, в свою очередь, приостановит выполнение запрос.[источник]
Там, где результаты потребляются не так быстро, как SQL Server может их доставить, будь то из-за клиента или сети, мы наблюдаем ASYNC_NETWORK_IO
накопление ожиданий. Повторим, это не повлияет на приобретенные блокировки, а только на продолжительность их удержания.
nolock
подсказку, всегда будет блокировка . Задержка просто определяет, как долго будет удерживаться блокировка.