Якщо клієнтові потрібно тривалий час для отримання даних і, в свою чергу, надсилає підтвердження SQL Server, що він отримав дані, яким SQL Server повинен чекати, через це очікування SQL Server не випустить блоки, що зберігаються в запиті, якщо підтвердження не буде отримано від клієнта.
Це не точно, це залежить від рівня ізоляції.
За замовчуванням READ COMMITTED
блокування не проводиться протягом тривалості виконання операторів. READ COMMITTED
не забезпечує узгодженість зчитування на рівні висловлювань, єдиною гарантією є те, що ви не можете читати непередані дані. Спільний замок набувається і утримується для читання рядка, а потім відпускається.
Якщо у вас немає типів LOB.
Типи LOB, будучи потенційно дуже великими, не можуть бути буферними. Спільний замок потрібно придбати та утримувати до завершення заяви, що по суті дає вам REPEATABLE READ
поведінку на READ COMMITTED
.
Якщо я здійснюю один виклик до бази даних MSSQL через мережу з високою затримкою, чи відбуватимуться блокування таблиці через цю затримку?
Затримка не викликає блокування таблиці, ні. Однак, якщо замок столу був придбаний, затримка його продовжить.
Цитувати когось, хто знає механіку цього краще, ніж я ( @RemusRusanu ):
Результати повертаються назад до клієнтської програми в міру тривання виконання. Коли рядки "бульбашки" складаються з дерева виконання, верхній оператор, як правило, має завдання записувати ці рядки в мережеві буфери та відправляти їх назад клієнту. Результат створюється не спочатку в деякому проміжному сховищі (пам'яті або диску), а потім надсилається назад клієнту, а натомість він надсилається назад, як створюється (як виконується запит). Передача результату клієнту, звичайно, підпорядковується протоколу управління мережевим потоком. Якщо клієнт не активно споживає результат (наприклад, зателефонувавши на SqlDataReader.Read ()), з часом контроль потоку повинен буде заблокувати сторону відправки (запит, який виконується), а це, в свою чергу, призупинить виконання запит.[джерело]
Якщо результати не споживаються так швидко, як SQL Server може їх доставити, будь то завдяки клієнту чи мережі, ми бачимо, що ASYNC_NETWORK_IO
накопичення чекає. Знову повторюю, це не вплине на придбані замки, просто на тривалість їх проведення.
nolock
підказку, замок завжди буде . Затримка просто визначає, як довго буде триматися замок.