Каталог статей
1. Обзор
2. Общие и эксклюзивные блокировки.
3. Глобальная блокировка
3.1 Введение 3.2 Грамматика 3.3 Особенности
4. Блокировки на уровне таблицы
5. Блокировки на уровне строк
6. Блокировка страницы, оптимистическая блокировка и пессимистическая блокировка.
7. Правила блокировки
8. Резюме
Клиент отправлен вMySQL
один за другимSQL
заявление,Фактически их можно понимать как отдельные транзакции (оператор SQL по умолчанию является транзакцией). И транзакция основана на базе dataconnected, каждая база данных Подключено вMySQL
середина,Рабочий поток будет использоваться для поддержания,Это также означает выполнение транзакции,По сути, выполняется рабочий поток,Когда несколько транзакций выполняются одновременно,Эта ситуация называется параллельной транзакцией.,Так называемая одновременная транзакция относится к одновременному выполнению нескольких потоков.
Одновременное выполнение нескольких потоков естественным образом вызовет проблемы, т.е. Основы MySQL: четыре основные проблемы транзакций, параллельные транзакции, уровни изоляции транзакций — грязная запись, грязное чтение, неповторяемое чтение, фантомное чтение. серединаупомянулиз Грязное письмо、грязное чтение, неповторяемое чтение и фантомные проблемы чтения. Этих проблем можно избежать, настроив уровень изоляции транзакции.,Так почему же этих проблем можно избежать, регулируя уровень изоляции транзакции? Это связано с тем, что разные уровни изоляции,Выполнение рабочего потокаSQL
заявлениечас,Степень детализации и используемый тип блокировки различны.
Как видно из вышеизложенного, механизм блокировки самой базы данных был рожден для решения проблем, вызванных параллельными транзакциями, главным образом для обеспечения безопасности данных, когда в базе данных параллельно выполняются несколько рабочих потоков.
Блокировки — это механизм, позволяющий компьютерам координировать одновременный доступ к ресурсу несколькими процессами или потоками. В базе данных, помимо традиционной конкуренции за вычислительные ресурсы (ЦП, ОЗУ, ввод-вывод), данные также являются ресурсом, совместно используемым многими пользователями. Как обеспечить согласованность и эффективность одновременного доступа к данным — это проблема, которую должны решать все базы данных. Конфликты блокировок также являются важным фактором, влияющим на производительность одновременного доступа к базам данных. С этой точки зрения блокировки особенно важны и сложны для баз данных.
MySQL
Механизм блокировки аналогичен механизму индексации.,Все они реализуются механизмом хранения.,Это также означает, что разные механизмы хранения,Поддерживаемые замки также различаются.,Это означает, что разные движки реализуют разную степень детализации блокировки. Но помимо разделения замков по степени детализации замков,Фактически, замки можно разделить и по другим измерениям.,Поэтому будет придумано множество терминов, касающихся замков.,Подведем краткий итогMySQL
система блокировки:
InnoDB
серединадля Поддержка нескольких уровней детализациииз Замок,длясовместимыйблокировка строки、замок стол И предназначен для изготовления замка стол Нет необходимости проверять каждую информацию строки Следует ли блокировать, используйте блокировку намерения, чтобы уменьшить замок Осмотр столаMySQL5.7
Версиясередина Недавно представленныйиз Замок,В основном решатьSMO
приносить Приходитьиз问题DDL
заявлениечасиспользоватьиз ЗамокSQL
заявлениечас,Вручную указать степень детализации блокировкиSQL
заявлениечас,Автоматически в зависимости от уровня изоляцииSQL
действоватьдобавлять ЗамокЕсли разобраться, то их довольно много, но если коротко, то на самом деле есть два типа блокировок: общие блокировки и монопольные блокировки. Просто они добавляются по-разному и в разных местах. Поэтому и названий блокировок так много. эволюционировали.
определение:Транзакция получила общую блокировку. Когда другая транзакция пытается прочитать данные с помощью общей блокировки, она может читать нормально, при выполнении операции записи она будет исключена общей блокировкой.。
общий замок означает очень простой,То есть не будет взаимного исключения между различными вопросами.,Блокировку можно получить и выполнить одновременно. Но то, что здесь называется, не исключает,просто означаетЭто не исключит другие транзакции из чтения данных, но исключение произойдет, когда другие транзакции попытаются записать данные.,Возьмите пример, чтобы понять:
дела
T1
верноID=18
данныедобавил одинобщий замок,в это времяделаT2、T3
тоже зайди почитатьID=18
эти данные,В это времяT2、T3
доступенобщий замокосуществлятьиз;Но в этот момент Приходить ПонятноодинделаT4
,ЭтодадуматьверноID=18
эти данныеосуществлять Исправлятьдействовать,В это время общий замок будет проявлять отталкивающее поведение.,не разрешеноT4
получать Замокосуществлять。
существоватьMySQL
середина,нас МожетксуществоватьSQL
заявлениеназаддобавлятьначальство Связанныйиз Ключевые слова Приходитьиспользоватьобщий замок,грамматикаследующее:
SELECT ... LOCK IN SHARE MODE;
-- После MySQL8.0 метод записи также был оптимизирован следующим образом:
SELECT ... FOR SHARE;
Этот вид прохождениясуществоватьSQL
назаддобавлятьдобавлять Ключевые словаиздобавлять Замокформа,известный как явная блокировка,И после фактической установки разных уровней изоляции транзакций для данных базы данных,MySQL
ТакжеверноSQL
автоматическийдобавлять Замок,Эта форма называется неявной блокировкой.
Пример. Чтобы провести небольшой тест общих блокировок, сначала откройте два окна cmd и установите соединение с MySQL.
-- Окно 1:
-- начать транзакцию
begin;
-- получатьобщий замок и вопрос id=2 данные
select * from bank_balance where id=2 lock in share mode;
-- Окно 2:
-- начать транзакцию
begin;
-- получатьобщий замок и вопрос id=2 данные
select * from bank_balance where id=2 lock in share mode;
-- пытаться Исправлятьid=2данные
update bank_balance set balance=230 where id=2;
Это видно из вышеизложенного,Транзакция получила общую блокировку. Когда другая транзакция пытается прочитать данные с помощью общей блокировки, она может читать нормально, при выполнении операции записи она будет исключена общей блокировкой.。поэтомуиз этого экспериментасередина Можетк得知:общий Замок также является эксклюзивным и исключает другие потоки, пытающиеся выполнить запись. Когда поток пытается изменить одни и те же данные, он будет заблокирован до тех пор, пока не будет сохранена общая информация. Транзакция замка должна быть завершена, прежде чем выполнение сможет продолжиться
После краткого понимания общих блокировок, приведенных выше, давайте взглянем на монопольные блокировки. Эксклюзивные блокировки также называются монопольными блокировками.
Когда поток получает монопольную блокировку, он исключает другие потоки (для операций чтения и записи). Если другие потоки также хотят работать с общими ресурсами/теми же данными, они должны дождаться, пока текущий поток не снимет блокировку и не будет конкурировать за них. заблокировать ресурс.。
Стоит отметить: эксклюзивный Замок используется не только для операций записи. Для операции чтения мы также можем указать вручную, чтобы получить эксклюзивный результат. замок,Когда транзакция получает исключительную блокировку при чтении данных, другие транзакции будут исключены при чтении или записи тех же данных.。напримердела
T1
верноID=18
эти данныедобавил одинэксклюзивный замок,в это времяT2
Приезжайте в Канадуэксклюзивный замок Прочтите эти данные,T3
Приходить Исправлять Эти данные,будетT1
исключать。
существоватьMySQL
середина,Эксклюзивная блокировка может быть получена явно следующим образом:
SELECT ... FOR UPTATE;
тест:
Когда две транзакции одновременно получают монопольные блокировки и пытаются прочитать один и тот же фрагмент данных, одна из транзакций будет заблокирована и не сможет продолжить выполнение до тех пор, пока не завершится другая транзакция;
ноselect * from bank_balance where id=2
Такое обычное чтение Не будет заблокирована, то есть другая транзакция не станет эксклюзивной. замок Чтение данных,Вместо этого прочитайте данные обычным способом.,Таким образом, вы можете выполнить его немедленно,Why
?дапотому чточитатьдействоватьпо умолчаниюдобавлятьобщий замок? Нет, потому что вы пытались добавить общее замок по-прежнему будет отклонен при чтении этих данных.
можно ясно увидеть,Во второй транзакции попробуйте прочитать эти данные, добавив общий замок.,Все равно будет зависать в заблокированном состоянии.,Так в чем же причина того, что данные можно прочитать раньше? На самом деле это связано с другой технологией управления параллелизмом.,Прямо сейчасMVCC
механизм,Подробности можно найти в Анализ принципов MVCC и то, как MySQL решает проблему фантомного чтения。
Добавление, удаление и изменение данных приведет к добавлению X-блокировок к данным. Использование for update в инструкции запроса также добавит X-блокировки.
S-замок | X-замок | |
---|---|---|
S-замок | √ | × |
X институт | × | × |
В предыдущем тесте,Каждый раз приобретается только блокировка,Но похоже, что его так и не выпустили Замок?на самом делеMySQL
серединавыпускать Замокиз Все действияда Скрытыйиз,Ведь если нам останется освободить,Из-за неправильной эксплуатации легко вызвать проблемы взаимоблокировки. Поэтому для работы по разблокировке замка,MySQL
Собственный Приходить Сухой,Точно так же, какJVM
серединаизGC
механизм Такой же,Оставьте работу по освобождению памяти себе.
SQL
осуществлять Заканчиватьназад Сразу立马выпускать Замок;исуществовать“повторяемое чтение”уровеньсередина,Он будет выпущен после завершения транзакции.Если вы точно следите за базой данныхспецификация Приходитьвыполнить
RC
уровень изоляции,для Гарантия другимдела Можеткчитать到未提交данные,Что Должно быть, этосуществоватьSQL
осуществлять Заканчиватьназад,Немедленно снимите блокировку,В это время另одиндела才能читать到SQL
вернодолжно быть написаноданные,носуществоватьInnoDB
двигательсередина,это основано наMVCC
механизмвыполнить Понятно Эффект,с этой целью,InnoDB
изRC
уровеньсередина,SQL
осуществлять Заканчиватьназад并Нетвстречавыпускать Замок。
Глобальная блокировка предназначена для блокировки всего экземпляра базы данных. После блокировки весь экземпляр находится в состоянии только для чтения. Последующие операторы записи DML, операторы DDL и операторы фиксации транзакции, которые были обновлены, будут заблокированы.
Типичный сценарий использования — создание логической резервной копии всей базы данных и блокировка всех таблиц для получения согласованного представления и обеспечения целостности данных.
Почему полное логическое резервное копирование базы данных требует полной блокировки? ——Разбираем возможные проблемы без добавления глобальной блокировки и ситуацию после добавления глобальной блокировки.
# добавлятьглобальная блокировка、получатьглобальная блокировка
flush tables with read lock;
# Резервное копирование данных. Конкретные инструкции можно найти в
mysqldump -u имя пользователя -p база данныхимя > /back/backup.sql
# выпускатьглобальная блокировка
unlock tables;
Подробные инструкции по резервному копированию данных можно найти в Общие команды MySQL+Redis+PostgreSQL+ClickHouse для запуска и закрытия соединений。
Добавление глобальной блокировки в базу данных является относительно трудоемкой операцией и сопряжено со следующими проблемами:
В движке InnoDB мы можем добавить параметр --single-transaction во время резервного копирования, чтобы выполнить согласованное резервное копирование данных без блокировки.
mysqldump --single-transaction -uroot –p123456 test > backup.sql
Блокировка на уровне таблицы блокирует всю таблицу для каждой операции. Степень детализации блокировок высокая, вероятность конфликта блокировок самая высокая, а параллелизм самый низкий. Применяется в таких механизмах хранения, как MyISAM, InnoDB и BDB.
Блокировка на уровне таблицы: блокирует всю таблицу для каждой операции. В основном разделены на три категории
InnoDB
серединадля Поддержка нескольких уровней детализациииз Замок,длясовместимыйблокировка строки、замок стол И предназначен для изготовления замка стол Нет необходимости проверять каждую информацию строки Следует ли блокировать, используйте блокировку намерения, чтобы уменьшить замок Осмотр столаЗамковый стол должен быть самым слышимым замком,Потому что это относительно просто реализовать,В то же время сфера применения также относительно широка.,Почти все механизмы хранения будут поддерживать эту блокировку детализации.,например Обычно используетсяизMyISAM、InnoDB、Memory
Ожидание внедрения всех основных двигателейзамок стола。
Накладные расходы на использование блокировок таблиц относительно невелики, блокировка выполняется быстро, взаимоблокировок не возникает, однако степень детализации блокировок велика, вероятность конфликтов блокировок выше, а параллелизм ниже; Блокировки таблиц не рекомендуются в механизме хранения innoDB и могут использоваться только в механизмах хранения без поддержки транзакций, таких как MyISAM.
Табличные блокировки делятся на две категории.:
грамматика:
Функции:
A.Чтение блокировки
Б. Блокировка записи
в заключение: Блокировки чтения не блокируют чтение других клиентов, но блокируют запись. Блокировки записи блокируют другим клиентам чтение и запись данных от других клиентов.。
Но следует отметить, что табличные блокировки разных движков немного отличаются по реализации и методам блокировки. Но в конечном итоге смысл табличных блокировок заключается в использовании таблицы как основы блокировки. Таблица может иметь только табличную блокировку того же типа.
Упоминается в отрывке выше,Различные механизмы хранения также имеют некоторые различия в том, как они используются.,напримерInnoDB
даодин Поддержка нескольких уровней детализации Замокизхранилищедвигатель,Его механизм блокировки реализован на основе кластерного индекса.,когдаSQL
осуществлятьчас,Если данные могут попасть в кластерный индекс,Затем добавьте блокировку строк.,Если не удалось выжитьсерединакластерный индексданныенодобавлятьиздазамок стол, например:
select * from bank_balance for update;
Вот этотSQL
я не могу житьсерединакластерный индекс,На этот раз естественным дополнением является эксклюзивный замок на уровне стола., но эта блокировка уровня таблицы не является настоящим замком стол, представляет собой «псевдозамок». стола”,Но эффект тот же,Весь стол заблокирован.
С другой стороны,MyISAM
двигатель,Поскольку он не поддерживает кластерные индексы,Так что уже невозможноInnoDB
из Этот видформа去верноповерхностьначальство Замок,поэтому Если ты хочешьсуществоватьMyISAM
двигательсерединаиспользоватьзамок стола,Необходимо использовать дополнительную грамматику,следующее:
-- Получите блокировку чтения в движке MyISAM (с общими функциями чтения-чтения)
LOCK TABLES `table_name` READ;
-- Получите блокировку записи в движке MyISAM (с эксклюзивными характеристиками записи-чтения и записи-записи)
LOCK TABLES `table_name` WRITE;
-- Просмотр замка, созданного в текущей библиотеке. стола(in_use>0поверхность示в настоящий моменттолькосуществоватьиспользоватьиззамок стола)
SHOW OPEN TABLES WHERE in_use > 0;
-- Снимите полученную блокировку
UNLOCK TABLES;
нравитьсяначальствоудобныйдаMyISAM
двигательсередина,Способы получения уровня стола общий замок и эксклюзивный замок,ноздесьизключевые слована самом деленазываетсяREAD、WEITE
,В переводе это означает чтение и письмо.,Итак, что касаетсяОбщие блокировки — это блокировки чтения, а монопольные блокировки — это блокировки записи.иззаявление,Вероятно, поэтому это и произошло.
но
MyISAM
двигательсередина,После приобретения замка вам необходимо самостоятельно снять замок вручную.,В противном случае произойдет взаимоблокировка,Потому что, если ты не снимешь блокировку вручную,Даже если транзакция завершится, она не будет освобождена автоматически.,пока некогдавпередизбаза данные будут освобождены только тогда, когда соединение будет прервано.
После того, как блокировка таблицы InnoDB явно получена, она должна быть активно освобождена сама по себе. В противном случае в сочетании с пулом соединений с базой данных, поскольку соединение с базой данных является длительным, блокировка таблицы всегда будет занята.
когдатыдобавлять Понятноread
читать Замокназад,Сновапытатьсядобавлятьwrite
Писать Замок,Вы обнаружите, что не можете получить замок,Текущая тема будет заблокирована,Напротив Приходитьтакжеда Та же причина。
Meta Data Lock
блокировка метаданных,также называемыйMDL
Замок,Это блокировка метаданных на основе таблиц.,что это значит?нассуществоватьначальство Вэнь сказал:замок стол основан на блокировке всей таблицы, блокировка строки блокируется на основе фрагмента данных,Чтоэтотповерхностьизметаданныеда Что??所иметьхранилищедвигательизповерхность Всевстречажитьсуществоватьодин.frm
документ,этотдокументсерединаосновнойхранилищеповерхностьизструктура(DDL
заявление,包括поверхностьструктураизопределениеинформация、создаватьудалить Исправлятьстол и т. д.)。и**MDL
Замок Сразудана основе.frm
документсерединаизметаданныедобавлять Замок**из。здесьизметаданные Его можно просто понимать как табличную структуру таблицы. Другими словами, когда определенная таблица включает в себя незафиксированные транзакции, структуру этой таблицы нельзя изменить.
Процесс блокировки MDL автоматически контролируется системой.,Нет необходимости явно использовать,Он будет автоматически добавлен при доступе к таблице.,При добавлении, удалении, изменении и проверке таблицы добавьте блокировку чтения MDL (общая); при изменении структуры таблицы добавьте блокировку записи MDL (эксклюзивную);。MDLЗамок Основная функцияда维护поверхностьметаданныеданныепоследовательность,Когда на столе есть активные транзакции,Нет Можетквернометаданные进ХОРОШОПисать入действовать。Чтобы избежать конфликта DML и DDL и обеспечить правильность чтения и записи。
MDLдасуществоватьMySQL5.5
Версияназад Снова开始поддерживатьиз,В общем, нам это не нужно,Таким образом, нет необходимости вручную получать блокировку.,основнойсуществовать Используется при изменении структуры таблицы.,Например, вы хотите создать/удалить индекс таблицы, изменить имя/тип данных поля, добавить/удалить поле таблицы и т. д. Потому что, в конце концов, когда структура вашей таблицы меняется,гипотезав это время Есть и другиедела Приходитьверноповерхность做CRUD
действовать,Проблемы естественно возникнут,Например, я только что удалил поле таблицы,В результате другая транзакция вставила фрагмент данных в соответствии с исходной структурой таблицы.,Очевидно, что существует риск,поэтомуMDL
Замоксуществовать После блокировки,Вся таблица не позволяет другим транзакциям выполнять какие-либо операции.
Общие операции SQL, добавлены блокировки метаданных:
Соответствует SQL | тип замка | иллюстрировать |
---|---|---|
блокировка таблиц xxx чтение/запись(замок стола) | SHARED_READ_ONLY / SHARED_NO_READ_WRITE | |
выбрать, выбрать... заблокировать в режиме общего доступа (обычное чтение, общая блокировка) | SHARED_READ (общая блокировка метаданных) | Совместимо с SHARED_READ, SHARED_WRITE, взаимоисключающее с EXCLUSIVE. |
вставить, обновить, удалить, выбрать... для обновления (добавление, изменение, удаление, монопольная блокировка) | SHARED_WRITE (общая блокировка метаданных) | Совместимо с SHARED_READ, SHARED_WRITE, взаимоисключающее с EXCLUSIVE. |
изменить таблицу... (изменить структуру таблицы) | ЭКСКЛЮЗИВ (эксклюзивная блокировка метаданных) | Взаимоисключается с другими MDL. |
Демо:
При выполнении операторов SELECT, INSERT, UPDATE, DELETE и других добавляются общие блокировки метаданных (SHARED_READ/SHARED_WRITE), совместимые друг с другом.
При выполнении инструкции SELECT добавляется общая блокировка метаданных (SHARED_READ). В настоящее время, если вы хотите изменить структуру таблицы и добавить монопольную блокировку метаданных (EXCLUSIVE), исключение будет заблокировано.
Мы можем проверить ситуацию блокировки метаданных в базе данных с помощью следующего SQL:
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
Обратите внимание на версию,metadata_locks
Таблица MySQL 5.6 версию и более поздние. Если вы используете MySQL версия ниже, чем 5.6, то таблица не будет существовать. Вы можете сделать это, запустив SELECT VERSION();
приди и проверь свой MySQL Версия.
1)представлять:
Чтобы избежать конфликтов между блокировками строк и блокировками таблиц, добавляемыми при выполнении DML, в InnoDB вводятся преднамеренные блокировки, поэтому блокировкам таблиц не нужно проверять, заблокирована ли каждая строка данных, а преднамеренные блокировки используются для уменьшения блокировки таблицы. чеки.
InnoDB
двигательда Что-то вроде Поддержка нескольких уровней детализации Замокиздвигатель,инамерение ЗамокнодаInnoDB
серединадля Поддержка нескольких уровней детализациииз Замок,длясовместимыйблокировка строки、замок столаидизайниз,Как понять это предложение? Давайте сначала посмотрим на пример:
Предположим, в таблице содержится 10 миллионов фрагментов данных.,сейчассуществоватьдела
T1
верноID=8888888
эти данныедобавил одинблокировка строки,в это время Приходить ПонятноодинделаT2
,Хотите получить блокировку записи на уровне таблицы для этой таблицы,После серии предыдущих объяснений,Каждый должен знать, что замок записи должен быть эксклюзивным замком.,То есть одновременно,Разрешить только текущие транзакции,Если в таблице есть другая транзакция, получившая блокировку,Текущая транзакция не может удовлетворить «эксклюзивность»,Поэтому замок невозможно получить.Тогда подумай об этом,потому что
T1
даверноID=8888888
данныедобавлять Понятноблокировка строки,ЧтоT2
получатьзамок столачас,да Нетда得先判断один下поверхностьсерединада Стоит ли сохранятьсуществоватьдругойделасуществоватьдействовать?Но потому чтоInnoDB
серединаиметьблокировка Понятие строки, поэтому любые данные в таблице строкиначальство Всеиметь Может能житьсуществоватьделадобавлять Замокдействовать,Чтобы точно знать ответ,MySQL
Сразу得将整张поверхностьиз1000W
Пройти все фрагменты данных один раз,Затем проверьте один за другим, есть ли блокировка.,Тогда эта эффективность, естественно, будет очень низкой.кто-то может сказать,Помедленнее, что случилось?,Приемлемый! Но на самом деле существует не только эта проблема,Есть еще одна фатальная проблема,напримерсейчассуществовать
MySQL
Было решено, что567W
данные строки,открыть для себя фронтданныеначальство Все没иметь Замокжитьсуществовать,Обход продолжается.помнить
MySQL
да Поддержка параллелизмаделаиз,также СразудаMySQL
толькосуществоватьсканированиеназадлапшаиз Каждыйданные строкида Стоит ли сохранятьсуществовать Замокчас,на всякий случайПриходит другая транзакция и добавляет блокировку к строке отсканированных данных.что делать?напримерсуществовать Нет.123W
фрагмент данныхначальстводобавил одинблокировка строк. Тогда мне придется сканировать его еще раз? Это бесконечный цикл, блокировка строкиизамок Проблема совместимости возникает между столами.
Из-за проблем совместимости между блокировками строк и блокировками таблиц были предложены блокировки намерений. Блокировка намерения на самом деле представляет собой специальную блокировку часов. Блокировка намерения на самом деле представляет собой своего рода идею «уведомления о списке». Как и в повседневной жизни, на нем обычно есть знак, указывающий, «пусто» оно или «загружено». " состояние, и блокировка намерения также имеет эту идею.
напримеркогдаделаT1
НамереватьсяверноID=8888888
Эти данныедобавлятьодинблокировка строки До(ХОРОШОуровеньизчитать Замок或Писать Замок),Сразувстреча先добавлятьодинповерхностьуровеньизнамерение Замок。в это времякогдаделаT2
пытатьсяполучатьодинблокировка уровня столачас,Сначала я проверю, есть ли на столе блокировка намерения.,Если да, то рассудите, связан ли это с вашим конфликтом.,Например, есть намерение общий замок на столе.,в настоящий моментT2
хотетьполучатьиздаповерхностьуровеньизчитать Замок,Естественно, получить его невозможно. Но наоборот,еслиT2
хотетьполучатьодинповерхность级из Писать Замокчас,конфликт появится,T2
делановстреча陷入阻塞,доT1
выпускать Понятно Замок(дела Заканчивать)до。
2) Классификация
Как только транзакция будет зафиксирована, общая блокировка намерения и эксклюзивная блокировка намерения будут автоматически сняты.
Вы можете проверить статус блокировки намеренных блокировок и блокировок строк с помощью следующего SQL:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
Обратите внимание на версию,MySQLДонекоторый Версия Нетподдерживатьdata_locks
table, то есть таблица может не существовать. Это можно сделать, запустив SELECT VERSION();
приди и проверь свой MySQL Версия.
3) Демонстрация
A. Намеренные общие блокировки и блокировки чтения таблиц совместимы.
Б. Исключающие блокировки с намерением, блокировки чтения таблицы и блокировки записи являются взаимоисключающими.
блокировка уровня строки,Каждая операция блокирует соответствующие строки данных. Минимальная степень детализации блокировки,Вероятность конфликта блокировки самая низкая,Высшая степень параллелизма。существоватьMySQL
многоизхранилищедвигательсередина,толькоInnoDB
двигательподдерживатьблокировка строки (не считая закрытых самоисследованных), MyISAM и другие движки не поддерживают блокировку строки【потому чтоInnoDB
Поддержка кластеризованного индекса——将данныехранилищеииндексировать в Понятнокусок,индексструктураизлистовой узел保жить Понятноданные строки。существовать Дократко рассказал о,InnoDB
серединаеслиспособен выжитьсередина Индексные данные,Сразувстречадобавлятьблокировка строки, если он не может попасть, будет добавлен замок. стола】。
InnoDBданныедана основеиндекс组织из,блокировка строкидапроходитьЗаблокировать запись индекса в индексеПриходитьвыполнитьиз,иЭто не блокировка записи。верно Вблокировка уровня строки,В основном делятся на следующие три категории:блокировка строки、замок зазора、Про ключевой замок
Конкретные детали заключаются в следующем:
Блокировка строки (блокировка записи), также известная как блокировка записи, строка данных таблицы и запись таблицы сами по себе имеют одно и то же значение. Блокировка, которая блокирует запись одной строки, чтобы предотвратить обновление и удаление строки другими транзакциями. Поддерживается как на уровне изоляции RC, так и на уровне RR.
Чтобы заблокировать строку данных, блокировку можно заблокировать только по индексу. Неиндексные блокировки будут повышены до блокировок уровня таблицы.
1)представлять
InnoDB реализует следующие два типа блокировок строк:
2)грамматика
-- Получить общий уровень строки замок
select * from bank_balance where id = 1 lock in share mode;
-- Получите эксклюзивный уровень строки замок
select * from bank_balance where id = 1 for update;
хочу использоватьInnoDB
изблокировка строки Сразуда这样Писатьиз,еслитыизSQL
Может убитьсередина Индексные данные,Тогда естественным дополнением является блокировка строки., наоборот замок стола。Но в Интернете много информации циркулирует поговорка.:InnoDB
двигательиззамок стол бесполезен,На самом деле, это предложение несколько вводит в заблуждение.,потому чтонамерение Замок、самоувеличивающийся замок、MDL
Замок Вседазамок стола,также включает в себяInnoDB
изблокировка строкидана основеиндексвыполнитьиз,例нравитьсясуществоватьupdate
заявление Исправлятьданныечас,гипотезаwhere
назадлапшаиз Условия фатальнысерединаиндекс,Что Что?добавлятьблокировка А как насчет строк? Если на данный момент у вас нет выбора, вы должны добавить замок стола Понятно,поэтомуInnoDB
иззамок стол полезен.
Заблокируйте разрыв записи индекса (исключая эту запись) и откройте левый и правый интервалы, чтобы гарантировать, что разрыв записи индекса остается неизменным и предотвратить вставку других транзакций в этот пробел и возникновение фантомных чтений. Поддерживается на уровне изоляции RR
1) Блокировка пробелов — это дополнение к блокировке строк. В основном она используется для решения проблемы фантомного чтения. Но чтобы разобраться в этом, мы сначала разбираемся, что такое пробел.
mysql> select * from bank_balance;
+----+-----------+---------+--------+
| id | user_name | balance | wealth |
+----+-----------+---------+--------+
| 1 | Jenny | 300 | 1 |
| 2 | Tom | 230 | 1 |
| 3 | Jack | 500 | 0 |
| 9 | Rose | 360 | 0 |
+----+-----------+---------+--------+
В последних двух фрагментах данных в приведенной выше таблице поле id меняется с 3 на 9, поэтому диапазон между 3 и 9 называется «пробелом», и блокировка пробела в основном блокирует этот диапазон.
Так почему же говорят, что замки с пробелами используются для решения проблемы фантомного чтения? Потому что концепция фантомного чтения такова: когда выполняется одна транзакция, другая транзакция вставляет часть данных, что приводит к обнаружению того, что результат не соответствует ожидаемому после завершения первой операции транзакции, что похоже на иллюзию. Например, возьмите приведенную выше таблицу в качестве примера.,сейчассуществоватьхотеть将
ID>2
изпользовательбаланс Изменить на100
,поэтомуделаT1
Найдите это первым ПонятноID>2
из3、9
两фрагмент данных并начальство Замок Понятно,Затем приступайте к изменению баланса пользователя,нов это времяделаT2
Проходить Приходить Вставить снова Понятноодин кусочекID=6、balance=320
данныеи отправить,ждатьT1
Исправлятьнад Понятно3、9
После двух фрагментов данных,в это время Снова次ЗапросID>2
данныечас,结果发сейчас ПонятноID=6
эти данныебалансне был Исправлять、Строок данных больше, чем раньше.В приведенном выше примере,
T2
потому что Новыйи отправить Понятнодела,такT1
Снова次Запросчастакже能看到ID=6
эти данные,Это похоже на галлюцинации,Для этих новых данных,Профессиональное название — фантомные данные.Чтобы предотвратить проблемы с безопасностью,так
T1
существоватьдействовать Довстречаверно目标данныедобавлять Замок,носуществоватьT1
делаосуществлятьчас,Эти фантомные данные еще не существуют,Вот и возникнет новая проблема: не знаю, куда добавить блокировку.,毕竟думатьхотетьверноID=6
данныедобавлять Замок,Сразудадобавлять Понятноодинокий。обычноизблокировка строки не могут решить проблему и не могут добавить замок стол, это слишком сильно влияет на производительность, в это время замок зазора возникло, главным образом, запирая зону разрыва
2) Правила добавления замков-замков
Примечание. Единственная цель блокировок пробелов — предотвратить вставку пробелов другими транзакциями. Гэп-блокировки могут сосуществовать. Гэп-блокировка, установленная одной транзакцией, не мешает другой транзакции использовать гэп-блокировку на том же гэпе.
select * from bank_balance where id=6 lock in share mode;
3) Демонстрация
A. Эквивалентный запрос по индексу (уникальный индекс), при блокировке несуществующих записей оптимизируйте блокировку с пробелами.
select * from bank_balance where id=6 lock in share mode;
когдаверноодин Нетжитьсуществоватьданные После блокировки,По умолчанию устанавливается интервал между двумя данными до и после.,левый и правый открытый интервал,То есть замок (3,9) и область, не включающая 3 и 9. Когда другие транзакции пытаются вставить данные в этот интервал,будет заблокирован,Только после завершения транзакции проведения замка зазора,чтобы продолжить операцию вставки.
B. Эквивалентный запрос по индексу (неуникальный обычный индекс), когда последнее значение не соответствует требованиям запроса при переходе вправо, блокировка следующего ключа перерождается в блокировку пробела.
представлять Проанализируйте это:мы знаемInnoDBизB+индекс дерева,листовой узелдаиметь序из双向链поверхность。 Если мы хотим запросить данные со значением 18 на основе этого вторичного индекса и добавить общую блокировку, можем ли мы заблокировать только строку 18? Нет, поскольку это неуникальный индекс, в этой структуре может быть несколько 18. Поэтому при блокировке он продолжит поиск позже и найдет значение, не соответствующее условиям (в данном случае это 29). ). В это время к 18 будет добавлена блокировка клавиш, а пробел перед 29 будет заблокирован.
Предположим, что возраст в таблице данных является неуникальным обычным индексом.
select * from sth where age=20 lock in share mode;
C. Запрос диапазона по индексу (уникальный индекс) — доступ будет осуществляться до тех пор, пока не будет обнаружено первое значение, не соответствующее условию.
Запросиз Условиеid>=6,并добавлятьдобавлятьобщий замок。 На этом этапе мы можем разделить данные на три части на основе существующих данных в таблице базы данных: [6], (6,9], (9, положительная бесконечность)
Таким образом, когда данные базы данных заблокированы, блокировка строки добавляется к 6, блокировка соседней клавиши 9 (включая промежуток между 9 и 9) и блокировка соседней клавиши положительной бесконечности (промежуток перед положительной бесконечностью и пробел до 9).
когдаверноодин Нетжитьсуществоватьданные После блокировки,По умолчанию устанавливается интервал между двумя данными до и после.,левый и правый открытый интервал,То есть замок (3,9) и область, не включающая 3 и 9. Когда другие транзакции пытаются вставить данные в этот интервал,будет заблокирован,Только после завершения транзакции проведения замка зазора,чтобы продолжить операцию вставки.
Но замок зазорадобавлятьсуществовать Нет同из Расположение,Объем блокировки также различен.,Если добавлено между двумя частями данных,Что Что?запираниеизобласть Сразуда两фрагмент данныхмеждуиззазор。еслидобавлятьсуществоватьначальствоповерхность
ID=1
данныеначальство,запираниеизобластьнода{1~1}
,Прямо сейчас ТолькозапираниеID=1
из Вот этотданные Линия закрыта зазораизэффектдадля Можно поставить защитуиз ХОРОШО,вместо существующей строки,Таким образом, другие несуществующие строки здесь не будут заблокированы.Примечание:
InnoDB
по умолчаниюизблокировка Алгоритм строки: Про ключевой замок,Итак, в реальных обстоятельствах,верноID=1
данныедобавлять Замокчас,запираниеизобласть Сразуда{-∞ ~ 1}
,Прямо сейчасбесконечно мало до1
междуизобласть。еслидобавлятьсуществоватьID=9
после,запираниеизобласть Сразуда{9 ~ +∞}
,Прямо сейчас9
последо бесконечностиизобласть。
Про ключевой замокдазамок зазораизPlus
Версия,或者Можеткобъяснять成да Что-то вроде Зависит отблокировка записи+замок Замок состоит из зазора:
И Про ключевой замокнодаобаизкомбинация,После блокировки,Прямо сейчасзапираниеОткрыть слева и закрыть справаизинтервал(каждый Про ключевой замокда Открыть слева и закрыть правый интервал), также заблокирует текущие данные строки。
действительныйначальствосуществоватьInnoDB
середина,За исключением некоторых особых обстоятельств,При попытке заблокировать часть данных,по умолчаниюдобавлятьизда Про ключевой замок, а не замок записи、замок зазора。также Сразудаобъяснять,В предыдущем примере фантомного чтения:,когдаT1
хотетьверноID>2
изпользователь做Исправлятьбаланс,запирание3、9
Эти двоеданные В строке по умолчанию добавляется Про. ключевой замок,также СразудакогдаделаT2
пытатьсявставлятьID=6
данныечас,Потому что есть временная блокировка,Следовательно, эти «фантомные данные» больше нельзя вставить.,также Сразу至少保障ПонятноT1
делаосуществлять Проходить程середина,У вас не возникнет проблем с фантомным чтением.
Целью пробельных блокировок и временных блокировок является решение проблемы повторяющегося чтения. Если используется уровень фиксации чтения, пробельные блокировки и временные блокировки станут недействительными.
Блокировки строк не являются неизменяемыми при определенных обстоятельствах. Существуют две основные ситуации.
конечно,Эти две ситуации на самом деле очень редки.,Так что вам просто нужно знать, что существует такое понятие, как загрубление замка,Этот вид Замоксделать шероховатымизсейчас象на самом делесуществоватьSQLServer
база данныхсерединаболее распространенный,потому чтоSQLServer
серединаиз Замокмеханизмдана основе ХОРОШО记录выполнитьиз,иMySQL
серединаиз Замокмеханизмнодана основеделавыполнитьиз
начальствоописыватьверноMySQL
Два из наиболее распространенныхиз Замокдетализация进ХОРОШОПонятно阐описывать(общий замокиэксклюзивный замок,глобальная блокировка, блокировки уровня таблицы, блокировки уровня строки), а затем давайте посмотрим на блокировку страницы、оптимистичная блокировкаипессимистический замок
блокировка страницыдаBerkeley DB
хранилищедвигательподдерживатьиз Что-то вроде Замокдетализация,конечно,потому чтоBDB
двигательодеялоOracle
приобретениеизпричина,поэтомуMySQL5.1
кназад Нет Снова直接性изподдерживать该двигатель(Необходимо интегрировать самостоятельно),Поэтому блокировок страниц относительно немного.,Достаточно, чтобы каждый немного понял.
Единственное, в чем у меня есть некоторые сомнения,Сколько данных содержится на одной странице? На самом деле, я тоже многого не знаю.,Ведь никогда им не пользовалсяBDB
двигатель,Но я оцениваю, что это всего лишь размер одной индексной страницы.,Прямо сейчас16KB
о。
После краткого понимания блокировки задней страницы давайте взглянем на два типа блокировок, разделенных с идеологического измерения, а именно оптимистическую блокировку и пессимистическую блокировку.
Оптимистическая блокировка — это мышление без блокировок.
Технология Lock-free в программировании,Другими словами, механизм оптимистичной блокировки.,один般Вседана основеCAS
思думатьвыполнитьиз,исуществоватьMySQL
серединано Можеткпроходитьversion
Версия Число+CAS
изформавыполнитьоптимистичная блокировка,также Сразудасуществоватьповерхностьсерединамногодизайнодинversion
Поле,РанназадсуществоватьSQL
Исправлятьчаскнравиться下формадействовать:
UPDATE ... SET version = version + 1 ... WHERE ... AND version = version;
также Сразуда Каждый条ИсправлятьизSQL
Всесуществовать Исправлятьназад,верноversion
Поледобавлятьодин,напримерT1、T2
дваделаодин起并发осуществлятьчас,когдаT2
делаосуществлять Отправлено успешноназад,Сразувстречаверноversion+1
,поэтомуделаT1
изversion=version
Это условие не может быть установлено,В конце концов откажусь от казни,потому что已经одеялодругойдела Исправлять Проходить Понятно。
конечно,Как правило, оптимистичная блокировка взаимодействует с механизмом повтора опроса.,напримерначальствоописыватьT1
осуществлятьнеудачаназад,Выполните тот же оператор еще раз,Пока у тебя не получится.
Из приведенного выше процесса нетрудно увидеть, что в ходе этого процесса не было добавлено никаких блокировок, поэтому была реализована концепция оптимистической блокировки/безблокировки. Однако эта форма подходит не для всех ситуаций. высокий уровень одновременности операций записи. Легко вызвать повторную попытку транзакции в течение длительного времени, что приводит к особенно медленному ответу клиента.
Таким образом, оптимистическая блокировка больше подходит для бизнес-сценариев, в которых чтение выполняется чаще, чем запись. Компании, которые часто выполняют запись в базу данных, не подходят для оптимистической блокировки.
Каждый раз, когда он выполняется, он блокируется, а затем выполняется. Вы можете использовать select...fot. обновить реализацию. Что мы анализировали ранее синхронизированное ключевое слово、AQS-RentrantLock Все они относятся к пессимистическому типу блокировки, то есть блокировку необходимо получать перед каждым выполнением, после чего выполнение может продолжаться. Исключительная блокировка в базе данных является типичным пессимистическим типом блокировки.
существоватьбаза данныхсерединахочу использоватьпессимистический замок, то есть добавление эксклюзивности к сделке замокfor update
Прямо сейчас Может,Больше никаких подробностей
Правила блокировки данных в MySQL можно свести к следующим трем типам:
два принципа
Две оптимизации
ОШИБКА
В таблице t нет записи с id=7. Согласно принципу 1 единицей блокировки является блокировка следующего ключа, а диапазон блокировки сеанса A равен (5,10];
Согласно оптимизации 2, это эквивалентный запрос (id=7), а id=10 не соответствует условиям запроса. Блокировка следующего ключа перерождается в блокировку с пробелом, поэтому окончательный диапазон блокировки равен (5,10);
Следовательно, сеанс B будет заблокирован, если он вставит запись с id=8 в этот пробел, но сеанс C может изменить id=10.
Давайте суммируем различные блокировки, обсуждаемые в этой статье, а также конфликты и отношения совместимости между ними:
PS: Горизонтальное направление (строка) в таблице указывает на транзакцию, которая уже удерживает блокировку, а вертикальное направление (столбец) указывает на транзакцию, запрашивающую блокировку.
Сравнение блокировок на уровне строк | Общий временный замок с ключом | Эксклюзивный ключевой замок. | замок зазора |
---|---|---|---|
Общий временный замок с ключом | совместимый | конфликт | совместимый |
Эксклюзивный ключевой замок. | конфликт | конфликт | совместимый |
замок зазора | совместимый | совместимый | совместимый |
Поскольку временная блокировка также заблокирует соответствующие данные строки, поэтому блокировка не будет повторяться в приведенной выше таблице. дизайн, и建Вседакизиз блокировка записи несовместимы, Та же причина, блокировка конфликтов записи тоже будут противоречивыми, давайте посмотрим на сравнение блокировок на уровне таблицы:
Сравнение блокировок на уровне таблицы | блокировка общего намерения | эксклюзивная блокировка намерений | блокировка метаданных | глобальная блокировка |
---|---|---|---|---|
блокировка общего намерения | совместимый | совместимый | конфликт | конфликт |
эксклюзивная блокировка намерений | совместимый | совместимый | конфликт | конфликт |
блокировка метаданных | конфликт | конфликт | конфликт | конфликт |
глобальная блокировка | совместимый | конфликт | конфликт | конфликт |
Глядя на это, вы действительно обнаружите, что на уровне таблицы существует множество конфликтов. Поскольку степень детализации блокировок относительно велика, конфликты будут возникать во многих случаях, но для блокировок на уровне таблицы нам нужно только сосредоточиться. наблокировка общего намеренияиобщийэксклюзивный замок Прямо сейчас Может,другойиз大много数为MySQL
из Скрытый Замок(существоватьздесь,блокировка общего намеренияиэксклюзивная блокировка намерений,Это также можно понимать какMyISAM
серединаизповерхностьчитать Замокиповерхность Писать Замок)。
поверхностьсерединаизконфликтисовместимыйпосле всегода Что это значит?конфликтизиметь в видудакогдаодиндела
T1
持иметь某个Замокчас,另одинделаT2
Приходитьпопросить того жеиз Замок,T2
встречапотому что Замокисключатьвстреча陷入阻塞ждать Состояние ожидания。Напротив Та же причина,Совместимый означает разрешение нескольким транзакциям одновременно получить одну и ту же блокировку.
ссылка Видео и заметки, связанные с Dark Horse Programmer、Механизм блокировки MySQL: как обеспечить безопасность чтения и записи данных в сценариях с высоким параллелизмом?