Механизм блокировки базы данных

база данных

Основные сведения о базе данных и управлении многоверсионным параллелизмом MVCC см. в предыдущей статье.Многоверсионный контроль базы данных и MVCC.

Весь контент в этой статье основан на движке MySQL/InnoDB.

Решения для параллельных транзакций

Грязные чтения, неповторяемые чтения и фантомные чтения — все это проблемы согласованности чтения базы данных, которые должны быть решены базой данных, обеспечивающей определенный механизм изоляции транзакций.

(1)замок механизм

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

  • пессимистический замок

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

  • оптимистическая блокировка

    Большинство из них реализованы на основе механизма записи версии данных.

(2)Многоверсионный контроль параллелизма MVCC

решатьчитай пишиконфликтные вопросы. Без блокировки непротиворечивый снимок данных в момент запроса данных генерируется через определенный механизм, и этот снимок используется для обеспечения согласованного чтения на определенном уровне (уровень оператора или уровень транзакции). Таким образом, операцию записи не нужно блокировать во время операции чтения, а операцию чтения не нужно блокировать во время операции записи.

Механизм блокировки MySQL/InnoDB

метод блокировки

  • двухступенчатый замок

    Блокировка/разблокировка – это два непересекающихся этапа Блокировка: только блокировка, не разблокировка. Стадия разблокировки: только разблокировка, а не блокировка.

тип замка

锁

блокировка детализации

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

блокировка на уровне стола

Блокировка с наибольшей степенью детализации блокировки в MySQL. Она блокирует всю таблицу, которая в данный момент обрабатывается. Она проста в реализации, потребляет меньше ресурсов, блокируется быстро и не вызывает взаимоблокировок. Его степень детализации блокировки является самой большой, вероятность возникновения конфликтов блокировок выше, а параллелизм является самым низким.Оба механизма MyISAM и InnoDB поддерживают блокировки на уровне таблицы.

блокировка уровня строки

Блокировка с наименьшей детализацией блокировки в Mysql, которая блокирует только строку текущей операции. Блокировки на уровне строк могут значительно уменьшить количество конфликтов в операциях базы данных. Его степень детализации блокировки является наименьшей, а параллелизм высоким, но накладные расходы на блокировку также самые большие, а блокировка выполняется медленно и могут возникать взаимоблокировки.

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

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

блокировка совместимости

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

общий замок

общий замок (Share Locks, сокращенно S-lock), также известный какблокировка чтения. Другие транзакции могут считывать данные одновременно и могут добавлять общие блокировки, но ни одна транзакция не может получить монопольную блокировку данных, пока не будут сняты все общие блокировки.

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

эксклюзивный замок (Exclusive lock, сокращенно X замок), также известный какблокировка записи. Если транзакция добавляет монопольную блокировку к объекту данных, только этой транзакции разрешено читать и изменять объект данных, а другие транзакции не могут добавлять какие-либо блокировки к объекту данных, пока транзакция не снимет монопольную блокировку объекта. Эксклюзивные блокировки всегда применяются во время операций обновления (INSERT, UPDATE или DELETE).

блокировка намерения

Чтобы разрешить сосуществование блокировок строк и блокировок таблиц и реализовать многогранный механизм блокировки, InnoDB также имеет две внутренние блокировки намерения, обе из которых являются блокировками намерения.блокировка стола.

  • Общая блокировка намерений (IS)

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

  • Эксклюзивная блокировка намерения (IX)

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

Роль блокировки намерения

В MySQL сосуществуют блокировки таблиц и строк.Если преднамеренные блокировки не вводятся, как определить, есть ли конфликт блокировок?

Предполагая, что транзакция T хочет добавить блокировку X к таблице T1, она должна определить, имеет ли каждая строка данных в таблице T1 блокировку S или блокировку X. Это было бы очень неэффективно и потребовало бы обхода всей таблицы. Все стало проще с введением блокировок намерений.

X предполагается, что транзакция T добавляет блокировки к таблицам T1, до этой транзакции предполагалось, что строка данных A плюс блокировка R S, затем таблица времени была заблокирована IS (перед транзакцией необходимо сначала применить блокировку строки данных S). получить блокировку таблицы iS). Поскольку блокировка X и блокировка IS конфликтуют, транзакция T должна дождаться завершения операции блокировки. Таким образом устраняется необходимость обхода операций, повышается эффективность разрешения конфликтов.

Меры предосторожности
  1. Блокировка намерения — это блокировка таблицы, которая представляет собой своего рода намерение.Это означает только то, что транзакция читает или записывает определенную строку записей, и она будет судить о наличии конфликта только тогда, когда блокировка строки будет фактически добавлена. Блокировки намерений автоматически добавляются InnoDB и не требуют вмешательства пользователя.
  2. IX и IS являются блокировками таблиц и не будут конфликтовать с блокировками строк, а только с блокировками таблиц..
Совместимость

Совместимость блокировки InnoDB показана ниже.

алгоритм блокировки

InnoDB в основном реализует три алгоритма блокировки строк.

  • Record Lock

    блокировка записи, блокировка записи строки

  • Gap Lock

    Gap lock, блокирует интервал

  • Next-Key Lock

    Блокировка записи + блокировка пробела, блокировка записи строки и интервал

Next-Key Lock

Gap Lock и Next-Key Lock предназначены для решения проблемы фантомного чтения.

Мы знаем, что уровень повторного чтения в MVCC — чтение моментального снимка, а представление для чтения создается в момент выполнения первого оператора select в транзакции, все последующие выборки повторно используют этот объект, поэтому можно гарантировать непротиворечивость каждого чтения. Однако это не гарантирует, что не будет проблем с фантомным чтением, и все еще возможно столкнуться с фантомным чтением при выполнении вставки/обновления, потому что поведение чтения моментального снимка SELECT без блокировки не может запретить другим транзакциям добавлять новые перекрывающиеся данные. . Может случиться так, что выбрано 2 записи, но при обновлении возвращается 3 успешных результата.

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

В спецификации MySQL фантомное чтение может происходить на уровне транзакций RR, InnoDB избегает этой ситуации с помощью гэп-блокировок. Эта реализация отличается от спецификации. Кроме того, блокировка следующей клавиши доступна только на уровне повторного чтения и не существует на уровне зафиксированного чтения.

Пример

Предположим, что таблица T1 (идентификатор закрытого ключа) имеет всего 3 записи.1, 3, 5, одновременно выполняются две транзакции.

Результат запроса транзакции A в момент времени T2 равен 5. Из-за использования оператора select ... for update Gap Lock будет добавлен к диапазону интервала (3,+∞).Поэтому вставки в пределах этого диапазона не допускаются.. Следовательно, результат запроса на T6 также равен 5, что позволяет избежать феномена фантомного чтения. Транзакция B хочет вставить 4 в момент времени T4, который принадлежит интервалу (3,+∞), поэтому запись будет заблокирована до завершения транзакции A.

использованная литература

Что делает блокировка намерения InnoDB?

Анализ обработки блокировки MySQL

Механизм блокировки Mysql прост для понимания

Всесторонний анализ и совместное использование механизма блокировки MySQL InnoDB

Статья, чтобы понять блокировку в механизме хранения InnoDB Mysql.