последовательность
Этот блог является первым блогом из серии [Видишь, значит веришь]. В нем в основном рассказывается о проблемах, которые могут возникнуть в параллелизме базы данных в теории, и о технологии решения проблем параллелизма — блокировках, правилах соглашений о блокировке — протоколе блокировки. Затем кратко объясняется соответствующая взаимосвязь между уровнем изоляции транзакций базы данных и протоколом блокировки. Следующие блоги исследуют детали реализации механизма InnoDB при различных уровнях изоляции посредством практической практики.
【Видишь, значит веришь】Проблема параллелизма в базе данных Блокирующий протокол Уровень изоляции
Видеть, это верить [] практический опыт, чтобы понять читать незарегистрированные && сериализуемые
[Видеть — значит верить] Практика «Сделай сам», чтобы понять READ COMMITTED && MVCC
Несколько типов проблем параллелизма базы данных
①Потерянное обновление
Две транзакции T1 и T2 читают одни и те же данные и изменяют их одновременно.Результат фиксации T2 уничтожает результат фиксации T1, что приводит к потере модификации T1 (второй тип потерянного обновления).
Существует также специальная потерянная модификация (утерянное обновление первого класса), как показано ниже. Поскольку эта потеря изменена для отображения на уровне изоляции [Read Uncommited], она не обсуждается.
2 неперечитываемое (неперечитываемое чтение)
После того как транзакция T1 считывает данные, транзакция T2 выполняет операцию обновления, так что транзакция T1 не может воспроизвести предыдущий результат чтения. В частности, включены три случая: (1) После того, как транзакция T1 читает определенные данные, транзакция T2 изменяет их, а когда транзакция T1 снова читает данные, она получает значение, отличное от предыдущего.
(2) После того, как транзакция T1 читает некоторые записи данных в соответствии с определенными условиями, транзакция T2 удаляет некоторые записи.Когда T1 снова запрашивает данные в соответствии с теми же условиями, обнаруживается, что некоторые записи исчезли. (3) После того, как транзакция T1 читает некоторые записи данных в соответствии с определенными условиями, транзакция T2 вставляет некоторые записи.Когда T1 снова запрашивает данные в соответствии с теми же условиями, она находит еще несколько записей.
##③Фантомное чтение
Фантомные чтения на самом деле являются частным случаем неповторяющихся чтений. Неповторяющиеся чтения (2) и (3) также известны как явления фантомного чтения. Неповторяющиеся чтения генерируются путем изменения и обновления данных, тогда как фантомные чтения генерируются путем вставки или удаления данных.
④ Грязное чтение
Транзакция Т1 модифицирует определенные данные и записывает их обратно на диск.После того, как транзакция Т2 читает те же данные, Т1 по какой-то причине откатывается.В это время данные, измененные Т1, восстанавливаются до исходного значения, а данные, прочитанные Т2 это то же самое, что и база данных.Если данные в T2 противоречивы, данные, считанные T2, являются «грязными данными», то есть неверными данными.
Основная методика одновременного контроля - заблокировать
Основной тип блока:①Эксклюзивные замки (Эксклюзивные замки, называемые X-замками)Эксклюзивные блокировки также известны как блокировки записи. Если транзакция T добавляет блокировку X к объекту данных A, только T может изменять и читать A, и никакая другая транзакция не может добавлять какие-либо блокировки к A до тех пор, пока T не снимет блокировку с A. Это гарантирует, что никакие другие транзакции не смогут прочитать или изменить A, пока T не снимет блокировку с A.②Общие блокировки (общие блокировки, называемые S-блокировками)Общие блокировки также известны как блокировки чтения. Если транзакция T добавляет блокировку S к объекту данных A, транзакция T может читать A, но не может изменять A. Другие транзакции могут добавлять только S-блокировку к A, но не X-блокировку до тех пор, пока T не снимет S-блокировку с A. Это гарантирует, что другие транзакции могут читать A, но не могут вносить какие-либо изменения в A, пока T не снимет блокировку S на A.
Зона для блокировки общей матрице совместимости общего блокировки
Соглашение о блокировке
При использовании двух основных блокировок, блокировки X и блокировки S, для блокировки объектов данных необходимо согласовать некоторые правила. Например, когда подавать заявку на блокировку X и блокировку S, время удержания блокировки, когда освобождать и т. д. Эти спецификации называются протоколами блокировки.
Протокол блокировки уровня 1
Протокол блокировки уровня 1:Транзакция T должна добавить блокировку X к данным A перед их изменением, и они не будут сняты до конца транзакции. Окончание транзакции включает нормальное завершение (фиксация) и аварийное завершение (откат)..Протокол блокировки уровня 1 для предотвращения утерянных модификаций. Проблема потери покрытия на рисунке 1 решается с использованием протокола блокировки первого уровня. Транзакция T1 сначала добавляет блокировку X к A, прежде чем читать A для модификации. Когда T2 запрашивает добавление блокировки X к A, он отклоняется. T2 может только ждать, пока T1 снимет блокировку с A, а затем T2 получает блокировку X от A. В это время он читает Взятое A уже 15 изменено T1, а затем вычисляет в соответствии с этим значением и записывает значение результата A=14 на диск. Это позволяет избежать потери обновлений T1.
Вторичный протокол блокировки
Вторичный протокол блокировки:Протокол блокировки первого уровня плюс транзакция T должны добавить S-блокировку к данным A перед чтением данных A, и S-блокировка может быть снята после чтения.Протокол вторичной блокировки не только предотвращает потерю изменений, но и предотвращает чтение «грязных» данных.. Проблема грязного чтения на рис. 2 решается с помощью протокола вторичной блокировки. Транзакция T1 добавляет блокировку X к C перед чтением C для модификации и записывает обратно на диск после изменения его значения. В это время T2 запрашивает добавление S-блокировки на C, поскольку T1 уже добавил X-блокировку на C, поэтому T2 может только ждать. T1 по какой-то причине был отозван, а C было восстановлено до исходного значения 100. После того, как T1 снимает блокировку X на C, T2 получает блокировку S на C и считывает C=100. Это позволяет избежать чтения «грязных» данных.
Протокол блокады уровня 3
Протокол блокировки уровня 3:Протокол блокировки первого уровня плюс транзакция T должны добавить блокировку S к данным A перед чтением данных A, и она не будет снята до конца транзакции..В дополнение к предотвращению потери модификации и чтения «грязных» данных протокол трехуровневой блокировки дополнительно предотвращает неповторяющееся чтение.. Не повторяемая проблема считывания на рисунке 3 решена с использованием трехуровневого протокола блокировки. Транзакция T1 добавляет блокировки к данным A и Data B Перед чтением данных A и Data B. Другие транзакции могут добавлять только блокировки в A и B, но не может добавить X блокировку, так что другие транзакции могут только прочитать только a и b, но не могут Изменить А., Б. В это время T2 просит добавить X блокировку на B, потому что T1 уже добавил S блокировку на B, поэтому T2 может только подождать. T1 снова читает значения A и B, чтобы проверить результаты. Поскольку другие транзакции не могут изменять значения A и B, результат все еще 150, а чтение можно повторить. В это время T1 выпускает S замки на A и B, а T2 получает блокировку X на B. Это позволяет избежать не повторяемых чтения.
Замок и мертвый замок
Блокировка может привести к взаимоблокировке livelock.
живой замок
Если транзакция T1 блокирует данные R, транзакция T2 запрашивает блокировку данных R, поэтому T2 ждет. Транзакция T3 также запрашивает блокировку R. После того, как транзакция T1 освобождает блок данных R, система сначала одобряет запрос на блокировку транзакции T3, а T2 все еще ждет. Затем T4 снова обращается к блоку R, и когда T3 освобождает блок R, система снова одобряет запрос блока T4. T2 может ждать вечно, что означает livelock.
Способ избежать livelock — это стратегия «первым пришел — первым обслужен». Когда несколько транзакций запрашивают блокировку одного и того же объекта данных, подсистема блокировки ставит транзакции в очередь в том порядке, в котором они запрашиваются. Как только блокировка объекта данных снимается, первая транзакция в очереди приложений утверждается для получения блокировки.
## тупик
Если транзакция T1 блокирует данные R1, транзакция T2 блокирует данные R2, а затем T1 запрашивает блокировку данных R2, поскольку T2 заблокировал данные R2, T1 ожидает, пока T2 освободит блокировку R2. Затем T2 снова применяется к блоку R1, потому что, поскольку T1 заблокировал данные R1, T2 может только ждать, пока T1 освободит блокировку R1. Таким образом, T1 ожидает T2, а T2 также ожидает T1 Две транзакции T1 и T2 никогда не могут завершиться, что приводит к взаимоблокировке.
Предотвращение взаимоблокировок:
①Метод разовой блокады
Метод однократной блокировки требует, чтобы транзакция блокировала все данные, которые будут использоваться одновременно, иначе она не может продолжать выполняться. Например, транзакция T1 на приведенном выше рисунке блокирует данные R1 и R2 одновременно, T1 может выполняться, а T2 ожидает. После завершения выполнения T1 блокировки на R1 и R2 снимаются, и T2 продолжает выполняться. Таким образом, не будет тупика.
Хотя метод разовой блокады может предотвратить возникновение взаимоблокировки, его недостаток очевиден. Блокировка данных для использования в будущем в одно время неизбежно расширит область действия блока, тем самым уменьшив параллелизм системы.
②Метод последовательной блокады
Метод последовательной блокировки заключается в том, чтобы заранее прописать порядок блокировки объектов данных, и все транзакции блокируются в соответствии с этим порядком.
Хотя метод блокировки заказа может эффективно избежать тупика, но проблема очевидна. Во-первых, система базы данных очень заблокировала объекты данных, и с данными вставки, удаление и другие операции постоянно меняются, поэтому ресурсы для поддержания блокады заказа очень сложно, дорого. Во-вторых, запрос транзакции может быть заблокирован как определенная транзакция, выполняемая динамически, трудно блокировать заранее определенный порядок.
Видно, что предотвращение возникновения взаимоблокировок не очень подходит для характеристик базы данных, поэтому для решения проблемы взаимоблокировок обычно используется диагностика и устранение взаимоблокировок.
Диагностика взаимоблокировки и удаление:
① Метод тайм-аута
Если время ожидания транзакции превышает время по умолчанию, это считается взаимоблокировкой.
②Диаграмма ожидания
Как только в системе возникает тупик, необходимо продемонстрировать. Обычное решение состоит в том, чтобы выбрать транзакцию, которая обрабатывает стоимость взаимоблокировки, отозвать ее, снять все блокировки, удерживаемые этой транзакцией, восстановить операции модификации данных, для которых она выполняется, чтобы другие транзакции выполнялись.
Двухэтапный протокол блокировки
Так называемый двухэтапный протокол блокировки означает, что все транзакции должны быть разделены надва этапана данныхблокировать и разблокироватьработать.
-
Прежде чем какие-либо данные будут прочитаны или записаны, необходимо подать заявку и получить блокировку данных.
-
После освобождения одного блока транзакции больше не применяют и не приобретают другие блоки.
То есть сделка делится на две фазы. Первый этап — приобретение блокады, также известный как этап расширения. На этом этапе транзакция может применить блокировку любого типа к любому элементу данных, но не может снять блокировку. Вторая фаза — снятие блокады, также известная как фаза сокращения. На этом этапе транзакция может снять блокировку любого типа для любого элемента данных, но не может применять дополнительные блокировки.
Соответствие транзакций протоколу двухфазной блокировки является достаточным, но не необходимым условием сериализуемого планирования. Другими словами, соответствие протоколу двухэтапной блокировки должно быть сериализуемым, а сериализуемое планирование может не обязательно соответствовать протоколу двухэтапной блокировки.
Левые T1 и T2 следуют протоколу двухэтапной блокировки, а правые T1 и T2 не следуют протоколу двухэтапной блокировки.Сходства и различия между протоколом двухэтапной блокировки и методом однократной блокировки
Метод однократной блокировки требует, чтобы транзакция заблокировала все данные, которые будут использоваться, иначе она не сможет продолжать выполняться. Таким образом, метод однократной блокировки соответствует протоколу двухэтапной блокировки.
Однако протокол двухсегментной блокировки не требует одновременной блокировки всех данных, используемых транзакцией, поэтому протокол двухсегментной блокировки может привести к взаимоблокировке. Как показано на рисунке:
Уровень изоляции базы данных
Протоколы блокировки и уровни изоляции строго не соответствуют.