Що блокує і як це відбувається?


20

Я намагався знайти деяку інформацію про блокування в SQL Server, але не зміг знайти стислого пояснення того, що це таке і як це відбувається. Не могли б ви просвітити мене?

Відповіді:


23

Аналогії

Іноді допомагає використовувати аналогії далеко від комп'ютерів.

Скажімо, у вас бал та двоє дітей. Лише одна дитина може мати м'яч у будь-який час. Однак якщо один з дітей отримує м'яч і не відпускає його, тому що він відволікається (наприклад, дивиться телевізор), то інша дитина не отримає грати з м'ячем.

Інша дитина заблокована з цього ресурсу.

Якщо порівняти це з телевізором, наприклад, кілька дітей можуть дивитись телевізор у будь-якій точці.

Замки

Якщо ми переходимо до світу баз даних, ми бачимо, що існують різні способи використання ресурсів (як і наші два приклади вище). Ми можемо виконувати "читання" або ми можемо виконувати "писати".

Коли ми хочемо читати дані, немає причини, що інші також не можуть читати дані - як і двоє людей, які переглядають телевізор. Однак якщо ми хочемо записати дані, то нам потрібно переконатися, що ніхто більше не дивиться на них. Якщо вони читають його, поки ми пишемо, вони отримають "брудні" читання. (Тобто вони побачать дані, частково виписані, що буде недійсним.)

Для того, щоб переконатися, що ці брудні читання ніколи не трапляються, у нас є два основних типи блокування - блокування читання та ексклюзивні блокування.

Прочитайте Блокування

Ви можете мати декілька різних з’єднань зчитування з одного джерела даних у будь-який момент часу. Але щоб переконатися, що ніхто не змінює ці дані під час їх читання, вони знімають блокування читання.

Як тільки у з'єднання є блокування читання на фрагменті даних, усі інші з'єднання повинні зачекати, поки вимкне блокування читання, перш ніж вони зможуть записати дані. Інші ж можуть вийняти власні читання Блоків на тій самій інформації.

Ексклюзивний замок

Якщо з'єднання хоче оновити / вставити / видалити фрагмент даних, вони повинні вийняти ексклюзивний замок. Це не дозволяє будь-якому іншому з'єднанню також зняти блокування даних (зробити замок виключним для цього з'єднання).

Якщо з'єднання має ексклюзивне блокування даних, жодне інше з'єднання не може читати дані. Це допомагає запобігти забрудненню читання, гарантуючи, що ніхто не може читати дані під час їх запису.

Блокування

"Блокування" - це просто термін, який означає, що одне з'єднання тримає блокування ресурсу, коли інше з'єднання хоче прочитати або записати на нього. Це не обов'язково означає, що з’єднання власника не випустить його, лише те, що він утримує його зараз.

Порівняйте це з випадком, коли дитина тримає м'яч. Дитина, яка тримає м'яч, блокує всіх інших дітей від проведення м'яча.

Тупик

Я знаю, що ви цього не запитували, але це лише ще один крок, щоб дійти до тупиків (і це пов’язано дуже безпосередньо з блокуванням).

Тупики можуть трапитися, коли у вас є два з'єднання, кожен з яких заблокований, але вони хочуть один для одного ресурсу. У цьому сценарії, як двоє дітей, що кожен має м'яч, але хоче, щоб м'яч іншого.

Як і діти, ці зв’язки взагалі не бажають ділитися. Кожне з'єднання потребує доступу до обох ресурсів, щоб продовжувати. Однак вони перебувають у стані постійного блокування. У цьому стані батько (СУБД) повинен увійти і вибрати програв, щоб один із дітей (з'єднань) мав доступ до обох ресурсів.

Після того, як це "виграшне" з'єднання зроблено, він звільняє ресурси, а потім інше ("програє") з'єднання може спробувати знову потрапити на обидва ресурси.

Отже, концепція глухого кута - це те, де у вас є два ресурси, які блокують один одного.


Тут ви можете прочитати більше про всі типи замків, які може запропонувати SQL Server, та про різні ресурси, які можуть спричинити блокування / тупики. Стаття давня, але вона все ще застосовується для SQL Server 2000 до 2008 R2. (Є ще кілька типів блокувань, доданих до пізніших версій SQL Server, але це дасть вам вихідну точку.)


1
@ Richard, як ви вже згадували, якщо настає глухий кут, тоді СУБД заходить і вибирає програш. Це автоматично робиться СУБД? Або погано розроблена система (та, у якої часто виникають тупикові місця) зупиняється, поки людина не ініціює СУБД для цього?
CenterOrbit

2
Для SQL Server це робиться автоматично (за умови, що база даних може виявити тупиковий стан ). Може виявити проблеми з його виявленням, якщо, наприклад, це фактично живий замок .
Річард

Відмінна і дуже ретельна відповідь Річарда. Ще один додатковий момент щодо активних блокувань (який насправді не слід порівнювати або стосуватися тупикових блоків, його просто звичайне блокування) ... SQL запобігає подальшому блокуванню, коли чекає ексклюзивний замок, IIRC після 4 послідовних перекриття загальних замків.
Марк Сторі-Сміт

5

Відмінне пояснення Річарда, але просто хотів додати посилання на офіційну документацію. Ці теми були написані для SQL Server 2000, але значна частина концепцій залишається незмінною і сьогодні:

Розуміння та уникнення блокування

Розуміння блокування в SQL Server

Редагувати - кілька доповнень:

Усі 3 є дуже відомими авторами SQL Server та / або MVP.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.