Исходная ссылка: blog.ouyangsihai.cn >>Еще один артефакт MySQL — блокировка, необходимая для собеседований по MySQL.
1 Что такое замок
1.1 Обзор замков
В жизни больше нет примеров замков, от древних простых дверных замков до замков с паролем, до нынешней разблокировки отпечатков пальцев, замков с распознаванием лиц, это все наглядные примеры замков, поэтому мы понимаем, что замки должны быть очень простыми.
Тогда есть блокировка в MySQL.Для MySQL блокировка является очень важной функцией.Блокировка базы данных предназначена для поддержки одновременного доступа к общим ресурсам и обеспечения целостности и согласованности данных, чтобы обеспечить высокий параллелизм.При доступе к базе данных , с данными проблем нет.
1.2 Две концепции замков
В базе данных и замок, и защелка могут называться замками, но значения у них разные.
Latchшироко известный как闩锁
(облегченный замок), потому что он требует очень короткого времени блокировки. Если это будет длиться долго, производительность приложения будет очень низкой.В движке InnoDB Latch можно разделить наmutex
(мьютекс) иrwlock
(блокировка чтения-записи). Его цель — обеспечить правильность параллельных потоков, работающих с критическими ресурсами, и обычно не существует механизма обнаружения взаимоблокировок.
Lockобъект事务
, который используется для блокировки объектов в базе данных, таких как таблицы, страницы и строки. А общий объект блокировки освобождается только после фиксации или отката транзакции (время освобождения может быть разным для разных уровней изоляции транзакций).
2 Блокировки в механизме хранения InnoDB
2.1 Детализация замков
В базе данных степень детализации блокировок может быть разделена на блокировки таблицы, блокировки страниц и блокировки строк. Гранулярность этих блокировок также будет повышена.блокировка обновленияЭто означает, что степень детализации текущей блокировки уменьшается.База данных может обновить 1000 блокировок строк таблицы до блокировки страницы или обновить блокировку страницы до блокировки таблицы.Дробность этих трех блокировок описана ниже (см. блог: https://blog.csdn.net/baolingye/article/details/102506072).
блокировка стола
Блокировка на уровне таблицы является наиболее детализированным механизмом блокировки среди механизмов хранения MySQL. Самая большая особенность механизма блокировки заключается в том, что логика реализации очень проста, а негативное влияние на систему минимально. Таким образом, получение замков и снятие замков происходит быстро. Так как блокировки на уровне таблицы блокируют всю таблицу за раз, проблемы взаимной блокировки, которая преследует нас, можно избежать.
Конечно, самое большое негативное влияние высокой степени детализации блокировки заключается в том, что вероятность блокировки ресурсов будет самой высокой, что значительно снизит ее.
Блокировка на уровне таблицы в основном используется некоторыми нетранзакционными механизмами хранения, такими как MyISAM, MEMORY и CSV.
Функции:Низкие накладные расходы и быстрая блокировка, отсутствие взаимоблокировок, высокая степень детализации блокировки, самая высокая вероятность конфликта блокировок и самый низкий уровень параллелизма.
блокировка страницы
Блокировка на уровне страницы является относительно уникальным уровнем блокировки в MySQL и не слишком распространена в других программах управления базами данных. Характеристика блокировки на уровне страницы заключается в том, что степень детализации блокировки находится между блокировкой на уровне строки и блокировкой на уровне таблицы, поэтому накладные расходы ресурсов, необходимые для получения блокировки, и возможности параллельной обработки, которые она может обеспечить, также находятся между двумя вышеуказанными. Кроме того, блокировка на уровне страницы, как и блокировка на уровне строки, может привести к взаимоблокировкам. В процессе реализации блокировки ресурсов в базе данных по мере уменьшения детализации блокировки ресурсов увеличивается объем памяти, необходимый для блокировки одного и того же объема данных, и алгоритм реализации будет становиться все более сложным. Однако по мере уменьшения степени детализации блокирующих ресурсов вероятность того, что запросы на доступ к приложениям столкнутся с ожиданием блокировки, будет уменьшаться, а общий параллелизм системы также будет увеличиваться. Основным из них, использующим блокировку на уровне страниц, является механизм хранения BerkeleyDB.
Функции:Накладные расходы и время блокировки ограничены между блокировками таблицы и блокировками строк; будут возникать взаимоблокировки; степень детализации блокировок ограничена между блокировками таблиц и блокировками строк, а степень параллелизма является средней.
блокировка строки
Самая большая особенность блокировки на уровне строк заключается в том, что степень детализации заблокированных объектов очень мала, и это также самая маленькая степень детализации блокировки, реализуемая основным программным обеспечением для управления базами данных. Поскольку степень детализации блокировки невелика, вероятность конфликта ресурсов блокировки также наименьшая, что может дать приложению максимально возможную возможность одновременной обработки и повысить общую производительность некоторых систем приложений с высокой степенью параллелизма.
Хотя блокировка на уровне строк может иметь большие преимущества в возможностях параллельной обработки, она также имеет много недостатков. Поскольку степень детализации ресурсов блокировки очень мала, каждый раз необходимо делать больше действий, чтобы получить и снять блокировку, и потребление, естественно, будет больше. Кроме того, блокировка на уровне строк также наиболее подвержена взаимоблокировкам.
Функции:Высокие накладные расходы, медленная блокировка, взаимные блокировки, наименьшая степень детализации блокировки, самая низкая вероятность конфликтов блокировок и самый высокий уровень параллелизма.
Сравнивая блокировки таблиц, мы можем обнаружить, что характеристики этих двух блокировок в основном противоположны, и с точки зрения блокировокблокировка на уровне столаОн больше подходит для приложений на основе запросов с небольшим объемом данных, обновляемых в соответствии с условиями индексирования, например для веб-приложений;блокировка уровня строкиОн больше подходит для приложений с большим количеством одновременных обновлений небольшого объема различных данных на основе условий индекса и параллельных запросов, таких как некоторые системы оперативной обработки транзакций (OLTP).
Степень детализации блокировок, поддерживаемых различными движками MySQL.
2.2 Типы замков
В механизме хранения InnoDB есть разные типы блокировок, которые описаны ниже.
S или X (общая блокировка, монопольная блокировка)
На самом деле есть только две операции над данными, а именно чтение и запись.Когда база данных реализует блокировки, она также будет использовать разные блокировки для этих двух операций; InnoDB реализует стандартныеблокировка уровня строки, это,Общая блокировка и эксклюзивная блокировка.
- Общая блокировка (блокировка чтения) (S Lock), которая позволяет транзакции читать ряд данных.
- Эксклюзивная блокировка (блокировка записи) (X Lock), которая позволяет транзакции удалять или обновлять строку данных.
Блокировка намерений IS или IX (общая, монопольная)
Чтобы обеспечить сосуществование блокировок строк и блокировок таблиц и реализовать механизм блокировок с множественной гранулярностью, механизм хранения InnoDB поддерживает дополнительный метод блокировки, называемыйблокировка намерения, блокировки намерения находятся в InnoDBблокировка на уровне стола, блокировка намерения делится на:
- Intent Shared Lock: указывает, что транзакция хочет получить общую блокировку определенных строк в таблице.
- Преднамеренная эксклюзивная блокировка: указывает, что транзакция хочет получить эксклюзивную блокировку определенных строк в таблице.
Кроме того, эти блокировки не обязательно сосуществуют, а некоторые блокировки несовместимы.совместимостьЭто означает, что после того, как транзакция A получает определенную блокировку определенной строки, транзакция B также пытается получить определенную блокировку этой строки.Если ее можно получить сразу, это называется совместимостью блокировки, в противном случае это называется конфликтом.
Давайте посмотрим на совместимость этих двух замков.
- Совместимость с S или X (общая блокировка, эксклюзивная блокировка)
- Совместимость с блокировкой намерения IS или IX (общая, монопольная)
3 Резюме фронта
Вот карта ума, чтобы обобщить предыдущие концепции.
4 Согласованное чтение без блокировки и последовательное чтение с блокировкой
Согласованное чтение с блокировкой
При запросе данных в транзакции обычная инструкция SELECT не блокирует запрошенные данные, и другие транзакции могут по-прежнему выполнять операции обновления и удаления запрошенных данных. Поэтому InnoDB обеспечивает два типа заблокированных операций чтения для дополнительной безопасности:
-
SELECT ... LOCK IN SHARE MODE
-
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
: Добавьте S-блокировки к прочитанным строкам, другие вещи могут добавить S-блокировки к этим строкам, если вы добавите X-блокировки, он будет заблокирован.
SELECT ... FOR UPDATE
: К запрошенным строкам и связанным индексным записям будут добавлены блокировки X, а блокировки S или X, запрошенные другими транзакциями, будут заблокированы. Когда транзакция фиксируется или откатывается, блокировки, добавленные этими двумя операторами, снимаются. Примечание: SELECT FOR UPDATE может блокировать строки, только если автофиксация отключена.Если автофиксация включена, совпадающие строки не будут заблокированы.
Последовательное чтение без блокировки
последовательное неблокирующее чтениеОтносится к способу, которым механизм хранения InnoDB считывает данные строки в текущей базе данных посредством управления несколькими версиями (MVVC). Если строка чтения выполняет операцию DELETE или UPDATE, то операция чтения не будет ждать снятия блокировки строки. Вместо этого InnoDB прочитает снимок строки. Таким образом, неблокирующий механизм чтения значительно улучшает параллелизм базы данных.
Согласованное неблокирующее чтение — это режим чтения InnoDB по умолчанию, то есть чтение не занимает и не ждет блокировки строк. на уровне изоляции транзакцийREAD COMMITTED
иREPEATABLE READ
Под капотом InnoDB использует последовательное чтение без блокировки.
Однако определение данных моментального снимка отличается. существуетREAD COMMITTED
На уровне изоляции транзакций всегда выполняются непротиворечивые неблокирующие операции чтения.Прочитать последний снимок заблокированных строк. пока вREPEATABLE READ
На уровне изоляции транзакций, затемПрочитать версию данных строки в начале транзакции.
Ниже мы используем простой пример, чтобы проиллюстрировать разницу между этими двумя методами.
Сначала создайте таблицу;
вставить часть данных;
insert into lock_test values(1);
Проверьте уровень изоляции;
select @@tx_isolation;
Следующие операции делятся на два типа транзакций.
существуетREPEATABLE READ
Под уровнем изоляции транзакций;
существуетREPEATABLE READ
На уровне изоляции транзакции считываются данные строки в начале транзакции, поэтому после того, как сеанс B изменяет данные, данные все еще можно запрашивать с помощью предыдущего запроса.
существуетREAD COMMITTED
Под уровнем изоляции транзакций;
существуетREAD COMMITTED
На уровне изоляции транзакций считываются последние данные моментального снимка версии строки, поэтому, поскольку сеанс B изменяет данные и фиксирует транзакцию, A не может прочитать данные.
Алгоритм блокировки 5 строк
Механизм хранения InnoDB имеет три алгоритма блокировки строк, а именно:
- Блокировка записи: блокировка записи одной строки.
- Блокировка промежутка: блокировка промежутка, блокирует диапазон, но не содержит саму запись.
- Next-Key Lock: Gap Lock+Record Lock, блокирует диапазон и блокирует саму запись.
Record Lock: Всегда блокировать записи индекса.Если таблица механизма хранения InnoDB не устанавливает никакого индекса при ее создании, то механизм хранения InnoDB будет использовать неявный первичный ключ для блокировки.
Next-Key Lock: Алгоритм блокировки, который сочетает в себе Gap Lock и Record Lock.В рамках алгоритма Next-Key Lock InnoDB использует этот алгоритм блокировки для запросов строк. Например, 10, 20 и 30, тогда диапазон, в котором индекс может быть блокировкой следующего ключа, будет следующим:
Помимо блокировки следующей клавиши, естьPrevious-Key LockingТехнология, эта технология прямо противоположна Next-Key Lock, заблокированный интервал - это диапазон интервала и предыдущее значение. То же значение, что и выше, с использованием технологии блокировки предыдущего ключа, тогда блокируемый интервал составляет:
Не все индексы будут добавлены с помощью Next-key Lock, вот один из них.особые обстоятельства, в случае, когда столбец запроса является уникальным индексом (включая индекс первичного ключа),Next-key Lock
будет понижен доRecord Lock
.
Далее поясним на примере.
CREATE TABLE test (
x INT,
y INT,
PRIMARY KEY(x), // x是主键索引
KEY(y) // y是普通索引
);
INSERT INTO test select 3, 2;
INSERT INTO test select 5, 3;
INSERT INTO test select 7, 6;
INSERT INTO test select 10, 8;
Теперь мы выполняем следующий оператор в сеансе A;
SELECT * FROM test WHERE y = 3 FOR UPDATE
Давайте проанализируем ситуацию блокировки в это время.
- для первичного ключа x
- Вспомогательный индекс у
Пользователи могут явно отключить Gap Lock следующими двумя способами:
- Установите уровень изоляции транзакции на READ COMMITED.
- Поместите параметр innodblocksunsafeforbinlog установлен в 1.
Роль Gap Lock: чтобы предотвратить вставку записей в один и тот же диапазон несколькими транзакциями, он предназначен для решенияФантомная проблема. При уровне изоляции MySQL по умолчанию (Repeatable Read) InnoDB использует его для решения проблемы фантомного чтения.
галлюцинации: Это означает, что в рамках одной и той же транзакции выполнение одного и того же оператора SQL дважды подряд может привести к разным результатам.Второй SQL может возвращать строки, которых не было ранее, то есть при первом выполнении есть другие строки, а при втором Транзакция вставляет в него новую строку.
6 Проблемы с замками
6.1 Грязные чтения
Грязное чтение:При разных транзакциях текущая транзакция может считывать незафиксированные данные другой транзакции. Также мы должны отметить, что уровень изоляции MySQL по умолчаниюREPEATABLE READ
Грязных чтений не будет.Условием для грязных чтений является то, что уровень изоляции транзакции должен бытьREAD UNCOMMITTED
, поэтому, если есть грязное чтение, это может быть вызвано этим уровнем изоляции.
Давайте посмотрим на это на примере.
Как видно из вышеприведенного примера, когда уровень изоляции нашей транзакцииREAD UNCOMMITTED
Когда сеанс A не отправлен, сеанс B может запросить данные, которые сеанс A не отправил.
6.2 Неповторяемое чтение
Неповторимое чтение:Это означает, что один и тот же набор данных считывается несколько раз в рамках транзакции, но несколько раз считываются данные разные, что нарушает принцип согласованности транзакций базы данных. Однако это все же отличается от грязного чтения: данные грязного чтения не фиксируются, а данные неповторяемого чтения — это данные, которые были зафиксированы.
Рассмотрим возникновение этой проблемы на следующем примере.
Как видно из приведенного выше примера, в сеансе A из-за того, что сеанс B вставил данные, результаты двух запросов несовместимы, поэтому возникает проблема неповторяющегося чтения.
На что нам нужно обратить внимание, так это на то, что данные, считанные неповторяемым чтением, являются зафиксированными данными, а уровень изоляции транзакции равенREAD COMMITTED
, мы можем принять эту проблему.
Если нам нужно избежать проблемы неповторяющихся чтений, мы можем использоватьАлгоритм блокировки следующего ключа(Установите уровень изоляции транзакции наREAD REPEATABLE
), чтобы избежать в MySQL неповторяющейся проблемы чтения, которая называется фантомной проблемой, т.Фантомная проблема.
6.3 Потерянные обновления
Отсутствующие обновления:Это означает, что операция обновления одной транзакции будет перезаписана операцией обновления другой транзакции, что приведет к несогласованности данных. Любой уровень изоляции текущей базы данных не приводит к проблеме потери обновлений, которая может возникнуть в среде многопользовательской компьютерной системы.
Как избежать проблемы потерянных обновлений, нам нужно только сделать операцию транзакции сериализованной, а не выполняться параллельно.
Обычно мы используемSELECT ... FOR UPDATE
Оператор, добавляющий эксклюзивную блокировку X к операции.
6.4 Резюме
Здесь мы подводим итоги, в основном для сравнения проблем, возникающих при разных уровнях изоляции транзакций, чтобы было понятнее.
Если в статье есть что-то неуместное, поправьте меня, если вам нравится читать в WeChat, вы также можете подписаться на меня.Публичный аккаунт WeChat:
好好学java
, доступ к высококачественным учебным ресурсам.Эта статья опубликована в блогеOpenWriteвыпуск!