Что такое блокировка и как это происходит?

20

Я попытался найти некоторую информацию о блокировке в SQL Server, но не смог найти краткое объяснение, что это такое и как это происходит. Не могли бы вы просветить меня?

jrara
источник

Ответы:

23

Аналогии

Иногда это помогает использовать аналогии вдали от компьютеров.

Допустим, у вас есть мяч и двое детей. Только один ребенок может иметь мяч одновременно. Однако, если один из детей получает мяч и не отпускает его, потому что он отвлекается (например, смотрит телевизор), то другой ребенок не сможет играть с мячом.

Другой ребенок заблокирован из этого ресурса.

Если сравнить это с телевизором, например, несколько детей могут смотреть телевизор в любой точке.

Замки

Если мы перейдем к миру баз данных, то увидим, что существуют разные способы использования ресурсов (как и в двух наших примерах выше). Мы можем выполнить «чтение» или «запись».

Когда мы хотим прочитать данные, нет никаких причин, чтобы другие тоже не могли читать данные - как два человека, смотрящие телевизор. Однако, если мы хотим записать данные, нам нужно убедиться, что никто другой не смотрит на них. Если они читают это, пока мы пишем, они получат «грязное» чтение. (Это означает, что они увидят частично записанные данные, которые будут недействительными.)

Чтобы гарантировать, что эти грязные чтения никогда не произойдут, у нас есть два основных типа блокировок: блокировки чтения и эксклюзивные блокировки.

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

Вы можете иметь несколько разных подключений, считывающих из одного и того же источника данных в любой момент времени. Но чтобы гарантировать, что никто не изменяет эти данные во время их чтения, они снимают блокировку чтения.

После того, как соединение заблокировало чтение части данных, все остальные соединения должны дождаться снятия блокировки чтения, прежде чем они смогут записать данные. Другие могут, однако, самостоятельно снимать блокировку чтения с той же части данных.

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

Если соединение хочет обновить / вставить / удалить часть данных, они должны снять эксклюзивную блокировку. Это препятствует тому, чтобы любое другое соединение также сняло блокировку данных (делая блокировку исключительно для этого соединения).

Когда соединение имеет эксклюзивную блокировку данных, никакие другие соединения не могут считывать данные. Это помогает предотвратить грязное чтение, гарантируя, что никто не сможет прочитать данные во время их записи.

блокировка

«Блокировка» - это просто термин, который означает, что одно соединение удерживает блокировку ресурса, когда другое соединение хочет выполнить чтение или запись в него. Это не обязательно означает, что соединение владельца не освободит его, просто оно в настоящее время удерживает его.

Сравните это с делом ребенка, держащего мяч. Ребенок, держащий мяч, не дает другим детям удерживать мяч.

тупик

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

Взаимные блокировки могут возникать, когда у вас есть два соединения, каждое из которых имеет блокировку, но им нужен ресурс друг друга. В этом сценарии это похоже на двоих детей, у каждого из которых есть мяч, но он хочет мяч другого.

Как и дети, этими связями не желают делиться вообще. Каждое соединение требует доступа к обоим ресурсам для продолжения. Однако они находятся в состоянии постоянной блокировки. В этом состоянии родитель (СУБД) должен войти и выбрать проигравшего, чтобы один из дочерних элементов (соединений) мог иметь доступ к обоим ресурсам.

Как только это «выигрышное» соединение выполнено, оно освобождает ресурсы, а затем другое («проигравшее») соединение может попытаться снова получить доступ к обоим ресурсам.

Итак, концепция тупика заключается в том, что у вас есть два ресурса, которые блокируют друг друга.


Здесь вы можете прочитать больше обо всех типах блокировок, которые предлагает SQL Server, и о различных ресурсах, которые могут вызывать блокировки / взаимоблокировки. Статья старая, но она по-прежнему применима для SQL Server 2000 до 2008 R2. (В более поздние версии SQL Server добавлено еще несколько типов блокировок, но это даст вам отправную точку.)

Ричард
источник
1
@Richard, как вы упомянули, если возникнет взаимоблокировка, тогда СУБД войдет и выберет проигравшего. Это автоматически выполняется СУБД? Или плохо спроектированная система (часто испытывающая взаимные блокировки) останавливается, пока человек не инициирует СУБД?
ЦентрОрбит
2
Для SQL Server это делается автоматически (при условии, что база данных может обнаружить взаимоблокировку ). Возможно, возникнут проблемы с его обнаружением, если, например, на самом деле это живой замок .
Ричард
Отличный и очень подробный ответ Ричарда. Еще одна точка на живых блокировках (которые на самом деле не следует сравнивать или связывать с взаимоблокировками, это просто старая блокировка) ... SQL предотвратит дальнейшие блокировки, когда ожидается эксклюзивная блокировка, IIRC после 4 последовательных перекрывающихся общих блокировок.
Марк Стори-Смит
5

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

Понимание и предотвращение блокировки

Понимание блокировки в SQL Server

Редактировать - некоторые дополнения:

Все 3 являются очень известными авторами SQL Server и / или MVP.

Аарон Бертран
источник