Мені було задано це питання на інтерв'ю, і відповіді не було. Хтось може тут пояснити?
Мені було задано це питання на інтерв'ю, і відповіді не було. Хтось може тут пояснити?
Відповіді:
Блокування БД може існувати на рядках, сторінках або цілих таблицях або індексах. Коли транзакція проводиться, блоки, утримувані транзакцією, займають ресурси. Ескалація блокування полягає в тому, що система консолідує декілька замків на один вищий рівень (наприклад, консолідуючи кілька блоків рядків на сторінці або декілька сторінок у цілу таблицю), як правило, для відновлення ресурсів, зайнятих великою кількістю дрібнозернистих замків.
Це зробить це автоматично, хоча ви можете встановити прапорці на таблицях (див. ALTER TABLE у книгах on-line), щоб контролювати політику ескалації блокування у цій конкретній таблиці. Зокрема, передчасна або надто охоча ескалація блокування була проблемою для старих версій Sybase та SQL Server, коли у вас два процеси одночасно писали окремі рядки на одну і ту ж сторінку. Якщо ви повернетесь досить далеко (IIRC SQL Server 6.5), SQL Server насправді не мав блокування рядків, а міг блокувати лише таблиці чи сторінки. Де це сталося, ви можете отримати суперечки між вставками записів на одній сторінці; часто ви кладете кластерний індекс на стіл, щоб нові вставки переходили на різні сторінки.
Це метод зменшення накладних витрат системи шляхом перетворення безлічі дрібнозернистих замків на менше грубозернистих. Більш детальну інформацію можна знайти тут і тут .
Наприклад, якщо у вас є багато (як правило, сотень і більше) блокувань на конкретних рядках у таблиці, як тільки ви перевищите максимально дозволену кількість блокувань, вони можуть бути замінені на замок у всій таблиці.
SQL Server робить Lock Escalation , щоб зменшити накладні витрати , перетворивши кілька дрібнозернистих замків низького рівня в грубозернисті блоки високого рівня.
Це міф , що Блокування рядків ескалація блокування сторінок , то ж саме , згадані вище, @ConcernedOfTunbridgeWells неправильно.
Якщо таблиця містить дуже мало оновлень рядків, SQL-механізм спробує взяти Row-Locks на цих рядках або Page-Lock на цих Сторінках. Скажімо, це взяло Row-Lock. Але якщо рядкові оновлення збільшують поріг (~ 5k блокування), то замість того, щоб брати декілька рядків-блокувань, потрібен один Table-Lock. Таким чином, це зменшує накладні витрати на пам'ять, вивільняючи кілька рядків-блокувань і приймаючи один Table-Lock, але збільшує одночасність. Те саме відбувається з блокуванням сторінки.
Поріг Укрупнення блокування знаходиться на- крайней мере , 5000 замків, і залежить від декількох факторів, докладне пояснення ескалація блокувань було згадано тут в MSDN Бол: https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx