Разбираемся с «блокировкой» в базе данных в одной статье (подробное объяснение с картинками и текстом)
Разбираемся с «блокировкой» в базе данных в одной статье (подробное объяснение с картинками и текстом)
1. Блокировка
1.1. Обзор Блокировки.
что такое замок
Замокэто компьютер, который координирует несколько процессов или потоководновременноМеханизм доступа к ресурсу。
существоватьбаза В сфере данных, помимо традиционной конкуренции за вычислительные ресурсы (ЦП, ОЗУ, ввод-вывод), данные также являются ресурсом, совместно используемым многими пользователями. Как обеспечить согласованность и достоверность данных при одновременном доступе ко всей базе данные — это проблема, которую необходимо решить, и конфликт Замок также затрагивает базу данныеодновременно является важным фактором производительности доступа.
Классификация замков
Глобальная блокировка:Замок Конечнобаза Все таблицы в данных.
Блокировка уровня таблицы:каждая операция Замок Оживите весь стол。
Блокировка уровня строки:каждая операция Замок Живите соответствующие данные строки。
1.2.Глобальная блокировка
общая ситуация Замок Это верновся база данныхПример плюс Замок,После добавления Замок весь экземпляр находится в состоянии только для чтения.,Последующие операторы DML и DDL,Обновленные операторы фиксации транзакции будут заблокированы.
Сценарии применения:
Сделайте логическую резервную копию всей базы данных.,Настроить все таблицы,Чтобы получить целостное представление,Обеспечьте целостность данных.
Если вы не добавите глобальный Замок,Последовательное выполнение операций резервного копирования и обновления бизнес-данных.,Приведет к несогласованности данных
Процесс использования глобальных блокировок для выполнения логического резервного копирования базы данных:
Добавить глобальный замок
Язык кода:sql
копировать
flush tables with read lock;
mysqldumpдабаза данные Инструмент для резервного копирования данных, выполнение резервного копирования данных
Примечание. mysqldump — это инструмент, предоставляемый MySQL, а не оператор sql. Его необходимо выполнять в командной строке Windows.
Язык кода:sql
копировать
mysqldump -uroot -p123456 user>user.sql
После добавления замка,DML и DDL заблокированы,Другие клиенты не могут записывать данные,Но DQL можно выполнить,Другие клиенты могут найти данные
Резервное копирование завершено,Получите резервные копии файлов,выпускать Замок
Язык кода:sql
копировать
unlock tables;
Демонстрация кейса (имитация трех клиентов):
Клиент А: добавить глобальный замок в базу данных.
Примечание. mysqldump — это инструмент, предоставляемый MySQL, а не оператор sql. Его необходимо выполнять в командной строке Windows.
На диске D вы можете видеть, что данные были заархивированы.
После успешного резервного копирования данных снимите блокировку на клиенте A.
Язык кода:sql
копировать
unlock tables;
В это время обновление в клиенте B может выполняться нормально.
Преимущества глобальных блокировок:
Обеспечьте целостность данных.
Недостатки глобальных блокировок:
Степень детализации очень велика. Если резервное копирование выполняется в основной базе данных, обновления не могут быть выполнены в течение периода резервного копирования, и бизнес будет практически остановлен.
Если бизнес-база данных Нетдаавтономная версиядаструктура «главный-подчиненный»,и раздельное чтение и письмо,Тогда резервное копирование в подчиненной базе данных не повлияет на операции чтения и записи главной базы данных.,Однако в течение периода резервного копирования ведомая библиотека не может вести двоичный журнал (binlog), синхронизированный с главной библиотекой.,Вызовет задержку «ведущий-подчиненный».
Другие способы добиться согласованного резервного копирования данных:
В движке InnoDB параметры можно добавлять во время резервного копирования. --single-transaction Параметры для выполнения согласованного резервного копирования данных без блокировки. Нижний уровень реализуется посредством чтения снимков.
Блокировки на уровне таблицы, как следует из названия, блокируют всю таблицу во время каждой операции. Применяется в таких механизмах хранения, как MyISAM, InnoDB и BDB.
1.3.2. Классификация блокировок на уровне таблицы.
поверхность Замок
Метаданные Замок
намерение Замок
1.3.3.Блокировка стола
Классификация блокировки стола:
Совместное использование таблиц читается как Замок (аббревиатура: читается Замок)
Для эксклюзивного использования напишите Замок (сокращение: напишите Замок)
Синтаксис блокировки:
Язык кода:sql
копировать
lock tables tb1 , tb2... read / write
Синтаксис снятия блокировки:
Язык кода:sql
копировать
unlock tables Или закройте клиентское соединение
Демонстрация случая блокировки записи:
Предположим, есть таблица оценок,Есть два клиента A и B.,Имитировать чтение Замок,Последовательно выполните следующие операции:
Метаданные Замок(meta data lock,MDL),Должен ЗамокдаАвтоматическое управление системойиз,Автоматический доступ к замку при доступе к столу.
Метаданные можно просто понимать как структуру таблицы.,Роль метаданных Замок заключается в обеспечении согласованности данных в структуре таблицы.,Избегайте конфликтов между DML и DDL,Обеспечьте точность чтения и письма.
MDL был представлен в MySQL5.5.,При добавлении, удалении, изменении или проверке таблицы,Добавить совместное чтение и общую запись MDL (shared_read/shared_write при изменении структуры таблицы);,Добавить MDL эксклюзивный Замок (эксклюзив).
общий замки совместимы друг с другом, а это значит, что вы можете читать и писать одновременно; замок и эксклюзивный замок являются взаимоисключающими,Указывает, что при добавлении, удалении, изменении и проверке,Изменения в структуре таблицы не могут быть выполнены одновременно.
Кейс-демонстрация блокировки метаданных:
Следующие операции демонстрируются по порядку.
Клиент А начинает транзакцию,иверноповерхностьscoreосуществлятьselectОперация запроса--->успехосуществлять
Язык кода:sql
копировать
begin
Язык кода:sql
копировать
select * from score;
Клиент Б также начинает транзакцию,иверноповерхностьscoreосуществлятьselectЗапрос、updateоперация обновления--->успехосуществлять
Язык кода:sql
копировать
begin
Язык кода:sql
копировать
select * from score;
Язык кода:sql
копировать
update score set math = 88 where id = 1;
Можно обнаружить, что вышеуказанные операции могут быть успешно выполнены.,причинадаобщие замки совместимы друг с другом,одновременно можно читать и писать。
Отправляйте транзакции клиентов A и B последовательно.
Язык кода:sql
копировать
commit;
Клиент А снова начинает транзакцию,и выполнить операцию выбора запроса,В это время MDL автоматически добавляет совместное чтение (shared_read) в структуру таблицы.
Язык кода:sql
копировать
begin
Язык кода:sql
копировать
select * from score;
Клиент B теперь выполняет операцию изменения структуры таблицы.,Результат заблокирован,Причина в том, что при выполнении оператора alter,MDL автоматически добавит эксклюзивный Замокexclusive в структуру таблицы.,Должен Замокиобщий замоквзаимоисключающие。
Язык кода:sql
копировать
alter table score add column java int;
В этот момент клиент А отправляет транзакцию,Состояние блокировки клиента Б снято,Причина в том, что клиент А поделился чтением релиза замка.
Мы можем сделать это, следуязаявление Проверять Метаданные Замок:
Язык кода:sql
копировать
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;
Прежде чем клиент выполнит любые операторы добавления, удаления, изменения или запроса.,На нижнем уровне находится лишь несколько метаданных.,Замокизтипдагорсткаобщий замок (shared_read), принадлежит таблице метаданных Metadata_locks
Выполните оператор выбора на клиенте A,ЗатемсуществоватьклиентBПосмотреть в Метаданные Замок:можно найтиMDLАвтоматически добавлено совместное чтение Замокshare_read
1.3.5. Блокировка намерения.
Чтобы избежать выполнения DML,Возник конфликт между блокировкой строки, добавленной клиентом A, и блокировкой таблицы, добавленной клиентом B.,Намерения Замок представлен в InnoDB
Намерение Замок не позволяет клиенту Б проверять, была ли добавлена каждая строка данных при попытке добавить таблицу Замок.,Непосредственно определить, можно ли успешно добавить таблицу Замок, на основе наличия намерения Замок и типа намерения Замок.,Сокращенный стол Замок проверяет.
намерение Классификация замков:
намерениеобщий замок(IS):иповерхность Замокобщий Совместим с замком (shared_read), взаимоисключающим с таблицей Замок, эксклюзивный замок (запись). Зависит отзаявлениеselect ... lock in share modeдобавить в 。
Эксклюзивный Замок (IX): со столом Замокобщий замок (shared_read) и эксклюзивный Замок (запись) являются взаимоисключающими, но намерения Замок не являются взаимоисключающими. Зависит отinsert、update、delete、select...for updateдобавить в 。
Мы можем проверить, успешно ли добавлена блокировка намерения, используя следующий оператор:
Язык кода:sql
копировать
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
Демонстрация кейса:
Клиент А начинает транзакцию,Затем выполните оператор выбора,Строка Замок будет автоматически добавлена к строке с id=1.,Затем вручную передатьlock in share modeплюснамерениеобщий замокIS:
Язык кода:sql
копировать
begin;
Язык кода:sql
копировать
select * from score where id = 1 lock in share mode;
Клиент Б добавляет таблицу Замок общего чтения Замок (shared_read) В это время таблица Замок успешно добавлена:
Язык кода:sql
копировать
lock tables score read;
Клиент B добавил таблицу Замок для записи Замок (write) и обнаружил, что она заблокирована:
Язык кода:sql
копировать
lock tables score write;
Клиент А начинает транзакцию,Затем выполните оператор обновления,встречаАвтоматически добавлять блокировки строк и блокировки намерений IX
Язык кода:sql
копировать
update score set math = 66 where id = 1;
Проверьте статус намерения Замок в клиенте B. Вы увидите, что намерение ЗамокIX добавлено:
Язык кода:sql
копировать
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
Добавить таблицу Замок (чтение) к клиенту B,Результат показывает, что он заблокирован.,Причина в том, что намерение ЗамокIX и таблица Замок, прочитанный Замок (читать), являются взаимоисключающими.
Язык кода:sql
копировать
lock tables score read;
Отправить транзакцию в клиенте А,Намерение ЗамокIX выпуск,Затем состояние блокировки чтения Замок в клиенте B снимается.
1.4. Блокировки на уровне строк.
Блокировка уровней строк: каждый раз добавляйте соответствующую строку данных и промежуток между строками.,Замок имеет наименьший размер частиц.,одновременновысшая степень。
Данные InnoDB организованы на основе индексов.,Строка Замок реализуется путем добавления замка к записи индекса в индексе.,Вместо добавления Замок в запись.
1.4.1. Классификация блокировок уровня строки.
ХОРОШОЗамок(Record Lock):Блокировка, которая блокирует запись одной строки,Запретить другим транзакциям обновлять и удалять эту строку. В Read Commit параметр Read Поддерживается на уровне повторяющейся задержки.
зазор Замок(Gap Lock):Разрыв в записи индекса блокировки (исключая эту запись),Убедитесь, что разрывы в индексных записях остаются неизменными.,Запретить вставку других транзакций во время этого разрыва,генерировать фантомное чтение。существоватьRead Поддерживается на уровне повторяемой изоляции.
ключ Замок(Next-Key Lock):Комбинация блокировки ряда и блокировки зазора,Текущие данные одновременно,и Замок Живите перед даннымииззазорGap。существоватьRead Поддерживается на уровне повторяемой изоляции.
1.4.2. Блокировка строки
Есть два типа замка,разделен наобщий замокиэксклюзивный замок
общий замок(S):Разрешить транзакции читать ХОРОШО,Запретить другим транзакциям получать эксклюзивный замок (X) для того же набора данных. То есть общий замок совместим с общим замком.,общий замокиэксклюзивный замок являются взаимоисключающими.
эксклюзивный замок(X):Разрешено получитьэксклюзивный Транзакция замка обновляет данные, не позволяя другим транзакциям получить общий доступ к тому же набору данных. замокиэксклюзивный замок。
Совместимость и исключение между замками:
Блокировка строки, соответствующая оператору SQL-запроса добавления, удаления, изменения и изменения:
По умолчанию InnoDB работает на уровне изоляции транзакции REPEATABLE READ. InnoDB использует временные блокировки ключей для поиска и сканирования индекса, чтобы предотвратить фантомное чтение.
При поиске по уникальному индексу,При выполнении сопоставления равенства существующих записей,будет автоматически оптимизирован под строку Замок.
Строка InnoDB Замок предназначена для добавления индекса Замок.,Если поле не проиндексировано,То есть данные этого поля не извлекаются с помощью условий индекса.,Тогда InnoDB добавит Замок ко всем записям таблицы.,В это время он будет повышен до Стол Замок.
Мы можем проверить, успешно ли добавлена блокировка строки, используя следующий оператор:
Язык кода:sql
копировать
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
1.4.3. Замок с зазором и ключевой замок.
По умолчанию InnoDB работает на уровне изоляции транзакции REPEATABLE READ. InnoDB использует временные блокировки ключей для поиска и сканирования индекса, чтобы предотвратить фантомное чтение.
Единственная цель пробела — предотвратить вставку других транзакций в пробел. Gap Замок может сосуществовать,Гэп Замок, полученный одной транзакцией, не мешает другой транзакции занять пробел Замок в том же пробеле.
Демонстрация кейса:
Эквивалентный запрос на основе индекса,И индекс является уникальным индексом (например, индексом первичного ключа).,给一个Нет存существоватьиззапись плюс ХОРОШОЗамокчас, Замок строки будет оптимизирован для разрыва замка. 。
Роль разрыва Замок: не позволяет другим одновременным транзакциям вставлять данные в пробел.
Если эквивалентный запрос выполняется на основе индекса, и индекс является обычным индексом (значения записей в полях могут повторяться), то при прохождении последнего значения вправо в листовом узле не соответствует запросу требования, временный замок с ключом превращается в замок с зазором.
Функция замка строки: предотвращает одновременное изменение однострочных записей.
Функция временного ключа Замок/GAP Замок: предотвращает вставку записей в пробелы до и после одной строки.,вызвать фантомное чтение
Если запрос диапазона выполняется на основе индекса, а индекс является уникальным индексом (например, индексом первичного ключа), то будет добавлена временная блокировка ключа, и будет получен доступ к первому значению, которое не соответствует условию.
Роль замка замка: предотвратить одновременное изменение строки.
Функция двух временных клавиш Замок: предотвращает одновременное изменение записей данных в пределах диапазона.