Основные сведения о базе данных и управлении многоверсионным параллелизмом 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 должна дождаться завершения операции блокировки. Таким образом устраняется необходимость обхода операций, повышается эффективность разрешения конфликтов.
Меры предосторожности
- Блокировка намерения — это блокировка таблицы, которая представляет собой своего рода намерение.Это означает только то, что транзакция читает или записывает определенную строку записей, и она будет судить о наличии конфликта только тогда, когда блокировка строки будет фактически добавлена. Блокировки намерений автоматически добавляются InnoDB и не требуют вмешательства пользователя.
- 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.