Блокировки и механизмы блокировки MySQL (очень подробные) — классификация блокировок, глобальные блокировки, общие блокировки, эксклюзивные блокировки таблиц, блокировки метаданных, блокировки строк, блокировки пробелов, оптимистические блокировки ключей, пессимистические блокировки;
Блокировки и механизмы блокировки MySQL (очень подробные) — классификация блокировок, глобальные блокировки, общие блокировки, эксклюзивные блокировки таблиц, блокировки метаданных, блокировки строк, блокировки пробелов, оптимистические блокировки ключей, пессимистические блокировки;

Каталог статей

1. Обзор

  • 1.1 Происхождение блокировок MySQL
  • 1.2 Определение блокировки
  • 1.3 Классификация замков

2. Общие и эксклюзивные блокировки.

  • 2.1 Общий замок (S-блокировка)
  • 2.2 Эксклюзивный замок (X lock)
  • 2.3 Снятие блокировки MySQL

3. Глобальная блокировка

3.1 Введение 3.2 Грамматика 3.3 Особенности

4. Блокировки на уровне таблицы

  • 4.1 Введение
  • 4.2 Блокировка стола
  • 4.3 Блокировка метаданных
  • 4.4 Блокировка намерения

5. Блокировки на уровне строк

  • 5.1 Введение
  • 5.2 Блокировка строки/блокировка записи (блокировка записи)
  • 5.3 Блокировка разрыва
  • 5.4 Блокировка следующей клавиши
  • 5.5 Увеличение детализации блокировки строк

6. Блокировка страницы, оптимистическая блокировка и пессимистическая блокировка.

  • 6.1 Блокировка страницы
  • 6.2 Оптимистическая блокировка
  • 6.3 Пессимистическая блокировка

7. Правила блокировки

8. Резюме

1. Обзор

1.1 Происхождение блокировок MySQL

Клиент отправлен вMySQLодин за другимSQLзаявление,Фактически их можно понимать как отдельные транзакции (оператор SQL по умолчанию является транзакцией). И транзакция основана на базе dataconnected, каждая база данных Подключено вMySQLсередина,Рабочий поток будет использоваться для поддержания,Это также означает выполнение транзакции,По сути, выполняется рабочий поток,Когда несколько транзакций выполняются одновременно,Эта ситуация называется параллельной транзакцией.,Так называемая одновременная транзакция относится к одновременному выполнению нескольких потоков.

Одновременное выполнение нескольких потоков естественным образом вызовет проблемы, т.е. Основы MySQL: четыре основные проблемы транзакций, параллельные транзакции, уровни изоляции транзакций — грязная запись, грязное чтение, неповторяемое чтение, фантомное чтение. серединаупомянулиз Грязное письмо、грязное чтение, неповторяемое чтение и фантомные проблемы чтения. Этих проблем можно избежать, настроив уровень изоляции транзакции.,Так почему же этих проблем можно избежать, регулируя уровень изоляции транзакции? Это связано с тем, что разные уровни изоляции,Выполнение рабочего потокаSQLзаявлениечас,Степень детализации и используемый тип блокировки различны.

1.2 Определение блокировки

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

Блокировки — это механизм, позволяющий компьютерам координировать одновременный доступ к ресурсу несколькими процессами или потоками. В базе данных, помимо традиционной конкуренции за вычислительные ресурсы (ЦП, ОЗУ, ввод-вывод), данные также являются ресурсом, совместно используемым многими пользователями. Как обеспечить согласованность и эффективность одновременного доступа к данным — это проблема, которую должны решать все базы данных. Конфликты блокировок также являются важным фактором, влияющим на производительность одновременного доступа к базам данных. С этой точки зрения блокировки особенно важны и сложны для баз данных.

1.3 Классификация замков

MySQLМеханизм блокировки аналогичен механизму индексации.,Все они реализуются механизмом хранения.,Это также означает, что разные механизмы хранения,Поддерживаемые замки также различаются.,Это означает, что разные движки реализуют разную степень детализации блокировки. Но помимо разделения замков по степени детализации замков,Фактически, замки можно разделить и по другим измерениям.,Поэтому будет придумано множество терминов, касающихся замков.,Подведем краткий итогMySQLсистема блокировки:

  • Делится на размер детализации замка
    • глобальная блокировка:запираниебаза Все таблицы в данных. плюс глобальная После блокировки вся база данные могут разрешать только чтение и не допускают никаких операций записи.
    • Блокировка на уровне таблицы: блокирует всю таблицу для каждой операции. В основном разделены на три категории
      • замок стол (разделен на таблицу с общей блокировкой чтения read блокировка, блокировка исключительной записи таблицы write lock)
      • блокировка метаданных(meta data lock, MDL): блокировка метаданных на основе таблицы. После блокировки вся таблица не допускает других транзакционных операций. Метаданные здесь можно просто понимать как табличную структуру таблицы.
      • Блокировка намерения (разделяется на намерение общее замок、намерениеэксклюзивный замок):ЭтоInnoDBсерединадля Поддержка нескольких уровней детализациииз Замок,длясовместимыйблокировка строки、замок стол И предназначен для изготовления замка стол Нет необходимости проверять каждую информацию строки Следует ли блокировать, используйте блокировку намерения, чтобы уменьшить замок Осмотр стола
    • Блокировка на уровне строк: каждая операция блокирует соответствующие данные. строки。В основном разделены на три категории
      • блокировка записи / Record Блокировка: то есть блокировка строка, запись и данные строка означает то же самое. Чтобы другие транзакции не могли обновлять и удалять эту строку, в Поддерживается на уровнях изоляции RC и RR.
      • замок зазора / Gap Блокировка: заблокируйте разрыв записи индекса (исключая запись), чтобы гарантировать, что разрыв записи индекса остается неизменным, и предотвратить вставку других транзакций в этот пробел и возникновение фантомного чтения. Поддерживается на уровне изоляции RR
      • Про ключевой замок / Next-Key Замок:замок Обновленная версия зазора, в которой также есть блокировка. записи+замок зазорафункция,Поддерживается на уровне изоляции RR
  • Разделить по принципу взаимного исключения.
    • общий замок / С-замок: разные вещи не исключают друг друга、Замки, которые можно получить одновременно
    • эксклюзивный замок / X-замок: замки, которые являются взаимоисключающими между различными транзакциями и могут быть приобретены только в рамках одной транзакции одновременно.
    • общийэксклюзивный замок / SX-замок:MySQL5.7Версиясередина Недавно представленныйиз Замок,В основном решатьSMOприносить Приходитьиз问题
  • кдействоватьтипиз Размеры
    • Блокировка чтения: блокировка, используемая при запросе данных.
    • Блокировка записи: выполнить вставку、удалить、Исправлять、DDLзаявлениечасиспользоватьиз Замок
  • кдобавлять Замок Способиз Размеры
    • 显示Замок:писатьSQLзаявлениечас,Вручную указать степень детализации блокировки
    • Скрытый Замок:осуществлятьSQLзаявлениечас,Автоматически в зависимости от уровня изоляцииSQLдействоватьдобавлять Замок
  • к思думатьиз Размеры
    • оптимистичная блокировка: Перед каждым выполнением думайте, что у вас все получится.,Итак, сначала попробуйте выполнить,Получить блокировку повторно в случае сбоя
    • пессимистический замок: Перед каждой казнью я думаю, что у меня ничего не получится.,Поэтому блокировка будет приобретена в первую очередь,а затем выполнить

Если разобраться, то их довольно много, но если коротко, то на самом деле есть два типа блокировок: общие блокировки и монопольные блокировки. Просто они добавляются по-разному и в разных местах. Поэтому и названий блокировок так много. эволюционировали.

2. Общие и эксклюзивные блокировки.

2.1 Общий замок (S-блокировка)

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

общий замок означает очень простой,То есть не будет взаимного исключения между различными вопросами.,Блокировку можно получить и выполнить одновременно. Но то, что здесь называется, не исключает,просто означаетЭто не исключит другие транзакции из чтения данных, но исключение произойдет, когда другие транзакции попытаются записать данные.,Возьмите пример, чтобы понять:

делаT1верноID=18данныедобавил одинобщий замок,в это времяделаT2、T3тоже зайди почитатьID=18эти данные,В это времяT2、T3доступенобщий замокосуществлятьиз;Но в этот момент Приходить ПонятноодинделаT4,ЭтодадуматьверноID=18эти данныеосуществлять Исправлятьдействовать,В это время общий замок будет проявлять отталкивающее поведение.,не разрешеноT4получать Замокосуществлять。

существоватьMySQLсередина,нас МожетксуществоватьSQLзаявлениеназаддобавлятьначальство Связанныйиз Ключевые слова Приходитьиспользоватьобщий замок,грамматикаследующее:

Язык кода:sql
копировать
SELECT ... LOCK IN SHARE MODE;
-- После MySQL8.0 метод записи также был оптимизирован следующим образом:
SELECT ... FOR SHARE;

Этот вид прохождениясуществоватьSQLназаддобавлятьдобавлять Ключевые словаиздобавлять Замокформа,известный как явная блокировка,И после фактической установки разных уровней изоляции транзакций для данных базы данных,MySQLТакжеверноSQLавтоматическийдобавлять Замок,Эта форма называется неявной блокировкой.

Пример. Чтобы провести небольшой тест общих блокировок, сначала откройте два окна cmd и установите соединение с MySQL.

Язык кода:sql
копировать
-- Окно 1:
-- начать транзакцию
begin;
-- получатьобщий замок и вопрос id=2 данные
select * from bank_balance where id=2 lock in share mode;
Язык кода:sql
копировать
-- Окно 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;
  • Когда окно 1 становится общим замок, когда окно 2 выполняет операцию запроса/чтения Доступен общий замок, обычное чтение, но когда окно 2 выполняет операции изменения/записи; Окно 2 не ответило и не было выполнено успешно.
  • Когда транзакция A в окне 1 зафиксирована, операция записи транзакции B в окне 2 может продолжать выполняться.

Это видно из вышеизложенного,Транзакция получила общую блокировку. Когда другая транзакция пытается прочитать данные с помощью общей блокировки, она может читать нормально, при выполнении операции записи она будет исключена общей блокировкой.。поэтомуиз этого экспериментасередина Можетк得知:общий Замок также является эксклюзивным и исключает другие потоки, пытающиеся выполнить запись. Когда поток пытается изменить одни и те же данные, он будет заблокирован до тех пор, пока не будет сохранена общая информация. Транзакция замка должна быть завершена, прежде чем выполнение сможет продолжиться

2.2 Эксклюзивный замок (X lock)

После краткого понимания общих блокировок, приведенных выше, давайте взглянем на монопольные блокировки. Эксклюзивные блокировки также называются монопольными блокировками.

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

Стоит отметить: эксклюзивный Замок используется не только для операций записи. Для операции чтения мы также можем указать вручную, чтобы получить эксклюзивный результат. замок,Когда транзакция получает исключительную блокировку при чтении данных, другие транзакции будут исключены при чтении или записи тех же данных.。напримерделаT1верноID=18эти данныедобавил одинэксклюзивный замок,в это времяT2Приезжайте в Канадуэксклюзивный замок Прочтите эти данные,T3Приходить Исправлять Эти данные,будетT1исключать。

существоватьMySQLсередина,Эксклюзивная блокировка может быть получена явно следующим образом:

Язык кода:sql
копировать
SELECT ... FOR UPTATE;

тест:

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

ноselect * from bank_balance where id=2Такое обычное чтение Не будет заблокирована, то есть другая транзакция не станет эксклюзивной. замок Чтение данных,Вместо этого прочитайте данные обычным способом.,Таким образом, вы можете выполнить его немедленно,Why?дапотому чточитатьдействоватьпо умолчаниюдобавлятьобщий замок? Нет, потому что вы пытались добавить общее замок по-прежнему будет отклонен при чтении этих данных.

можно ясно увидеть,Во второй транзакции попробуйте прочитать эти данные, добавив общий замок.,Все равно будет зависать в заблокированном состоянии.,Так в чем же причина того, что данные можно прочитать раньше? На самом деле это связано с другой технологией управления параллелизмом.,Прямо сейчасMVCCмеханизм,Подробности можно найти в Анализ принципов MVCC и то, как MySQL решает проблему фантомного чтения

Добавление, удаление и изменение данных приведет к добавлению X-блокировок к данным. Использование for update в инструкции запроса также добавит X-блокировки.

S-замок

X-замок

S-замок

×

X институт

×

×

2.3 Снятие блокировки MySQL

В предыдущем тесте,Каждый раз приобретается только блокировка,Но похоже, что его так и не выпустили Замок?на самом делеMySQLсерединавыпускать Замокиз Все действияда Скрытыйиз,Ведь если нам останется освободить,Из-за неправильной эксплуатации легко вызвать проблемы взаимоблокировки. Поэтому для работы по разблокировке замка,MySQLСобственный Приходить Сухой,Точно так же, какJVMсерединаизGCмеханизм Такой же,Оставьте работу по освобождению памяти себе.

  • Но для времени открытия блокировки,Это не одно и то же на разных уровнях изоляции.,Например, на уровне «чтение незафиксированных»,даSQLосуществлять Заканчиватьназад Сразу立马выпускать Замок;исуществовать“повторяемое чтение”уровеньсередина,Он будет выпущен после завершения транзакции.

Если вы точно следите за базой данныхспецификация ПриходитьвыполнитьRCуровень изоляции,для Гарантия другимдела Можеткчитать到未提交данные,Что Должно быть, этосуществоватьSQLосуществлять Заканчиватьназад,Немедленно снимите блокировку,В это время另одиндела才能читать到SQLвернодолжно быть написаноданные,носуществоватьInnoDBдвигательсередина,это основано наMVCCмеханизмвыполнить Понятно Эффект,с этой целью,InnoDBизRCуровеньсередина,SQLосуществлять Заканчиватьназад并Нетвстречавыпускать Замок。

3. Глобальная блокировка

3.1 Введение

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

Типичный сценарий использования — создание логической резервной копии всей базы данных и блокировка всех таблиц для получения согласованного представления и обеспечения целостности данных.

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

3.2 Грамматика

Язык кода:sql
копировать
# добавлятьглобальная блокировка、получатьглобальная блокировка
flush tables with read lock;  

# Резервное копирование данных. Конкретные инструкции можно найти в 
mysqldump -u имя пользователя -p база данныхимя > /back/backup.sql

# выпускатьглобальная блокировка
unlock tables;

Подробные инструкции по резервному копированию данных можно найти в Общие команды MySQL+Redis+PostgreSQL+ClickHouse для запуска и закрытия соединений

3.3 Особенности

Добавление глобальной блокировки в базу данных является относительно трудоемкой операцией и сопряжено со следующими проблемами:

  • Если резервное копирование выполняется для основной базы данных, обновления не могут быть выполнены в течение периода резервного копирования, и бизнес будет фактически остановлен.
  • Если резервное копирование выполняется в подчиненной базе данных, подчиненная база данных не может выполнять двоичный журнал (binlog), синхронизированный с главной базой данных, в течение периода резервного копирования, что приведет к задержке между главным и подчиненным.

В движке InnoDB мы можем добавить параметр --single-transaction во время резервного копирования, чтобы выполнить согласованное резервное копирование данных без блокировки.

Язык кода:sql
копировать
mysqldump --single-transaction -uroot –p123456 test > backup.sql

4. Блокировки на уровне таблицы

4.1 Введение

Блокировка на уровне таблицы блокирует всю таблицу для каждой операции. Степень детализации блокировок высокая, вероятность конфликта блокировок самая высокая, а параллелизм самый низкий. Применяется в таких механизмах хранения, как MyISAM, InnoDB и BDB.

Блокировка на уровне таблицы: блокирует всю таблицу для каждой операции. В основном разделены на три категории

  • замок стол (разделен на таблицу с общей блокировкой чтения read блокировка, блокировка исключительной записи таблицы write lock)
  • блокировка метаданных(meta data lock, MDL): блокировка метаданных на основе таблицы. После блокировки вся таблица не допускает других транзакционных операций. Метаданные здесь можно просто понимать как табличную структуру таблицы.
  • Блокировка намерения (разделяется на намерение общее замок、намерениеэксклюзивный замок):ЭтоInnoDBсерединадля Поддержка нескольких уровней детализациииз Замок,длясовместимыйблокировка строки、замок стол И предназначен для изготовления замка стол Нет необходимости проверять каждую информацию строки Следует ли блокировать, используйте блокировку намерения, чтобы уменьшить замок Осмотр стола

4.2 Блокировка стола

Замковый стол должен быть самым слышимым замком,Потому что это относительно просто реализовать,В то же время сфера применения также относительно широка.,Почти все механизмы хранения будут поддерживать эту блокировку детализации.,например Обычно используетсяизMyISAM、InnoDB、MemoryОжидание внедрения всех основных двигателейзамок стола。

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

Табличные блокировки делятся на две категории.

  • Общая блокировка чтения таблицы (блокировка чтения)
  • Эксклюзивная блокировка записи таблицы (блокировка записи)

грамматика

  • Блокировка: заблокировать имя таблицы таблиц... чтение/запись
  • Снятие блокировки: разблокировка таблиц/отключение клиента

Функции

A.Чтение блокировки

Б. Блокировка записи

в заключение: Блокировки чтения не блокируют чтение других клиентов, но блокируют запись. Блокировки записи блокируют другим клиентам чтение и запись данных от других клиентов.

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

Упоминается в отрывке выше,Различные механизмы хранения также имеют некоторые различия в том, как они используются.,напримерInnoDBдаодин Поддержка нескольких уровней детализации Замокизхранилищедвигатель,Его механизм блокировки реализован на основе кластерного индекса.,когдаSQLосуществлятьчас,Если данные могут попасть в кластерный индекс,Затем добавьте блокировку строк.,Если не удалось выжитьсерединакластерный индексданныенодобавлятьиздазамок стол, например:

Язык кода:sql
копировать
select * from bank_balance for update;

Вот этотSQLя не могу житьсерединакластерный индекс,На этот раз естественным дополнением является эксклюзивный замок на уровне стола., но эта блокировка уровня таблицы не является настоящим замком стол, представляет собой «псевдозамок». стола”,Но эффект тот же,Весь стол заблокирован.

С другой стороны,MyISAMдвигатель,Поскольку он не поддерживает кластерные индексы,Так что уже невозможноInnoDBиз Этот видформа去верноповерхностьначальство Замок,поэтому Если ты хочешьсуществоватьMyISAMдвигательсерединаиспользоватьзамок стола,Необходимо использовать дополнительную грамматику,следующее:

Язык кода:sql
копировать
-- Получите блокировку чтения в движке 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Писать Замок,Вы обнаружите, что не можете получить замок,Текущая тема будет заблокирована,Напротив Приходитьтакжеда Та же причина。

4.3 Блокировка метаданных

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:

Язык кода: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 Версия.

4.4 Блокировка намерения

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) Классификация

  • намерениеобщий замок (IS): выбирается оператором ... lock in share добавить режим, подключиться столаобщий замок(read)совместимый,Взаимно с замком стол эксклюзивный замок (напишите). При подготовке к добавлению S-замка в данные таблицы,Сначала вам необходимо получить IS-замок стола.
  • намерениеэксклюзивный замок(IX):Зависит отinsert、update、delete、select...for обновитьдобавить 。изамок столаобщий замок(read)иэксклюзивный замок(write)Все взаимоисключающие,Намеренные блокировки не являются взаимоисключающими. При подготовке к добавлению Х-замка в данные таблицы,Сначала вам необходимо получить IX-замок стола.

Как только транзакция будет зафиксирована, общая блокировка намерения и эксклюзивная блокировка намерения будут автоматически сняты.

Вы можете проверить статус блокировки намеренных блокировок и блокировок строк с помощью следующего SQL:

Язык кода: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. Намеренные общие блокировки и блокировки чтения таблиц совместимы.

Б. Исключающие блокировки с намерением, блокировки чтения таблицы и блокировки записи являются взаимоисключающими.

5. Блокировки на уровне строк

5.1 Введение

блокировка уровня строки,Каждая операция блокирует соответствующие строки данных. Минимальная степень детализации блокировки,Вероятность конфликта блокировки самая низкая,Высшая степень параллелизма。существоватьMySQLмногоизхранилищедвигательсередина,толькоInnoDBдвигательподдерживатьблокировка строки (не считая закрытых самоисследованных), MyISAM и другие движки не поддерживают блокировку строки【потому чтоInnoDBПоддержка кластеризованного индекса——将данныехранилищеииндексировать в Понятнокусок,индексструктураизлистовой узел保жить Понятноданные строки。существовать Дократко рассказал о,InnoDBсерединаеслиспособен выжитьсередина Индексные данные,Сразувстречадобавлятьблокировка строки, если он не может попасть, будет добавлен замок. стола】。

InnoDBданныедана основеиндекс组织из,блокировка строкидапроходитьЗаблокировать запись индекса в индексеПриходитьвыполнитьиз,иЭто не блокировка записи。верно Вблокировка уровня строки,В основном делятся на следующие три категории:блокировка строки、замок зазора、Про ключевой замок

  • блокировка строки(Record Блокировка): блокировка, которая блокирует запись одной строки, чтобы предотвратить обновление и удаление строки другими транзакциями. В Поддерживается на уровнях изоляции RC и RR.
  • замок зазора(Gap Lock):Заблокируйте разрыв записи индекса (исключая эту запись) и откройте левый и правый интервалы, чтобы гарантировать, что разрыв записи индекса остается неизменным и предотвратить вставку других транзакций в этот пробел и возникновение фантомных чтений. Поддерживается на уровне изоляции RR
  • Про ключевой замок(Next-Key Lock):блокировка строкиизамок зазора комбинации, заблокируйте данные одновременно и заблокируйте пробел перед данными, Открыть слева и закрыть справа。 Поддерживается на уровне изоляции RR

Конкретные детали заключаются в следующем:

5.2 Блокировка строки/блокировка записи (блокировка записи)

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

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

1)представлять

InnoDB реализует следующие два типа блокировок строк:

  • общий замок (S): позволяет транзакции читать строку.,Не позволяет другим транзакциям получить монопольную блокировку того же набора данных.
  • эксклюзивный замок(X):позволятьполучатьэксклюзивный Транзакция замка обновляет данные, не позволяя другим транзакциям получить общую информацию того же набора данных. замокиэксклюзивный замок。

2)грамматика

Язык кода:sql
копировать
-- Получить общий уровень строки замок
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иззамок стол полезен.

5.3 Блокировка разрыва

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

1) Блокировка пробелов — это дополнение к блокировке строк. В основном она используется для решения проблемы фантомного чтения. Но чтобы разобраться в этом, мы сначала разбираемся, что такое пробел.

Язык кода:sql
копировать
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) Правила добавления замков-замков

  • Эквивалентный запрос по индексу (уникальный индекс) при блокировке несуществующих записей, Оптимизирован для замка зазора
  • Эквивалентный запрос по индексу (неуникальный обычный индекс), когда последнее значение не соответствует требованиям запроса при переходе вправо, по следующему ключу. lock деградировал в замок зазора
  • Запрос диапазона по индексу (уникальный индекс) – доступ будет осуществляться до тех пор, пока не будет получено первое значение, не соответствующее условию.

Примечание. Единственная цель блокировок пробелов — предотвратить вставку пробелов другими транзакциями. Гэп-блокировки могут сосуществовать. Гэп-блокировка, установленная одной транзакцией, не мешает другой транзакции использовать гэп-блокировку на том же гэпе.

Язык кода:sql
копировать
select * from bank_balance where id=6 lock in share mode;

3) Демонстрация

A. Эквивалентный запрос по индексу (уникальный индекс), при блокировке несуществующих записей оптимизируйте блокировку с пробелами.

Язык кода:sql
копировать
select * from bank_balance where id=6 lock in share mode;

когдаверноодин Нетжитьсуществоватьданные После блокировки,По умолчанию устанавливается интервал между двумя данными до и после.,левый и правый открытый интервал,То есть замок (3,9) и область, не включающая 3 и 9. Когда другие транзакции пытаются вставить данные в этот интервал,будет заблокирован,Только после завершения транзакции проведения замка зазора,чтобы продолжить операцию вставки.

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

представлять Проанализируйте это:мы знаемInnoDBизB+индекс дерева,листовой узелдаиметь序из双向链поверхность。 Если мы хотим запросить данные со значением 18 на основе этого вторичного индекса и добавить общую блокировку, можем ли мы заблокировать только строку 18? Нет, поскольку это неуникальный индекс, в этой структуре может быть несколько 18. Поэтому при блокировке он продолжит поиск позже и найдет значение, не соответствующее условиям (в данном случае это 29). ). В это время к 18 будет добавлена ​​блокировка клавиш, а пробел перед 29 будет заблокирован.

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

Язык кода:sql
копировать
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последо бесконечностиизобласть。

5.4 Блокировка следующей клавиши

Про ключевой замокдазамок зазораизPlusВерсия,或者Можеткобъяснять成да Что-то вроде Зависит отблокировка записи+замок Замок состоит из зазора:

  • блокировка записано: Заблокированный диапазон — это конкретные данные в таблице строки。
  • замок зазора: Заблокированный диапазон левый и правый открытый интервал,Но он не включает текущий фрагмент реальных данных.,Заблокирована только область зазора.

И Про ключевой замокнодаобаизкомбинация,После блокировки,Прямо сейчасзапираниеОткрыть слева и закрыть справаизинтервал(каждый Про ключевой замокда Открыть слева и закрыть правый интервал), также заблокирует текущие данные строки。

действительныйначальствосуществоватьInnoDBсередина,За исключением некоторых особых обстоятельств,При попытке заблокировать часть данных,по умолчаниюдобавлятьизда Про ключевой замок, а не замок записи、замок зазора。также Сразудаобъяснять,В предыдущем примере фантомного чтения:,когдаT1хотетьверноID>2изпользователь做Исправлятьбаланс,запирание3、9Эти двоеданные В строке по умолчанию добавляется Про. ключевой замок,также СразудакогдаделаT2пытатьсявставлятьID=6данныечас,Потому что есть временная блокировка,Следовательно, эти «фантомные данные» больше нельзя вставить.,также Сразу至少保障ПонятноT1делаосуществлять Проходить程середина,У вас не возникнет проблем с фантомным чтением.

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

5.5 Увеличение детализации блокировки строк

Блокировки строк не являются неизменяемыми при определенных обстоятельствах. Существуют две основные ситуации.

  • Для хранения объекта блокировки в памяти выделяется специальное пространство.,Когда территория заполнена,воляблокировка линия — Грануляцияиззамок стола。
  • При выполнении операции записи диапазона, за счет дополнительной блокировки Линия слишком длинная, на этот раз блок строки будут дороже и тоже будут огрублены до замка стола。

конечно,Эти две ситуации на самом деле очень редки.,Так что вам просто нужно знать, что существует такое понятие, как загрубление замка,Этот вид Замоксделать шероховатымизсейчас象на самом делесуществоватьSQLServerбаза данныхсерединаболее распространенный,потому чтоSQLServerсерединаиз Замокмеханизмдана основе ХОРОШО记录выполнитьиз,иMySQLсерединаиз Замокмеханизмнодана основеделавыполнитьиз

6. Блокировка страницы, оптимистическая блокировка и пессимистическая блокировка.

начальствоописыватьверноMySQLДва из наиболее распространенныхиз Замокдетализация进ХОРОШОПонятно阐описывать(общий замокиэксклюзивный замок,глобальная блокировка, блокировки уровня таблицы, блокировки уровня строки), а затем давайте посмотрим на блокировку страницы、оптимистичная блокировкаипессимистический замок

6.1 Блокировка страницы

блокировка страницыдаBerkeley DBхранилищедвигательподдерживатьиз Что-то вроде Замокдетализация,конечно,потому чтоBDBдвигательодеялоOracleприобретениеизпричина,поэтомуMySQL5.1кназад Нет Снова直接性изподдерживать该двигатель(Необходимо интегрировать самостоятельно),Поэтому блокировок страниц относительно немного.,Достаточно, чтобы каждый немного понял.

  • замок стол: Таблица как степень детализации,Заблокированы все данные таблицы.
  • блокировка строки: На поведенческой детализации часть данных блокируется.
  • Блокировка страницы: при детализации страниц блокируется одна страница данных.

Единственное, в чем у меня есть некоторые сомнения,Сколько данных содержится на одной странице? На самом деле, я тоже многого не знаю.,Ведь никогда им не пользовалсяBDBдвигатель,Но я оцениваю, что это всего лишь размер одной индексной страницы.,Прямо сейчас16KBо。

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

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

Оптимистическая блокировка — это мышление без блокировок.

  • оптимистичная блокировка: Считается, что каждое выполнение имеет только один собственный поток.,Поэтому нет необходимости брать блокировку и выполнять ее напрямую.,Сравните дату последнего обновления данных
  • пессимистический замок: каждый раз, когда он выполняется, считается, что другие потоки будут работать вместе, поэтому каждый раз перед выполнением необходимо получить блокировку, чтобы гарантировать, что она не будет управляться другими транзакциями, вы можете использовать select...fot; обновить реализацию.

Технология Lock-free в программировании,Другими словами, механизм оптимистичной блокировки.,один般Вседана основеCAS思думатьвыполнитьиз,исуществоватьMySQLсерединано МожеткпроходитьversionВерсия Число+CASизформавыполнитьоптимистичная блокировка,также СразудасуществоватьповерхностьсерединамногодизайнодинversionПоле,РанназадсуществоватьSQLИсправлятьчаскнравиться下формадействовать:

Язык кода:sql
копировать
UPDATE ... SET version = version + 1 ... WHERE ... AND version = version;

также Сразуда Каждый条ИсправлятьизSQLВсесуществовать Исправлятьназад,верноversionПоледобавлятьодин,напримерT1、T2дваделаодин起并发осуществлятьчас,когдаT2делаосуществлять Отправлено успешноназад,Сразувстречаверноversion+1,поэтомуделаT1изversion=versionЭто условие не может быть установлено,В конце концов откажусь от казни,потому что已经одеялодругойдела Исправлять Проходить Понятно。

конечно,Как правило, оптимистичная блокировка взаимодействует с механизмом повтора опроса.,напримерначальствоописыватьT1осуществлятьнеудачаназад,Выполните тот же оператор еще раз,Пока у тебя не получится.

Из приведенного выше процесса нетрудно увидеть, что в ходе этого процесса не было добавлено никаких блокировок, поэтому была реализована концепция оптимистической блокировки/безблокировки. Однако эта форма подходит не для всех ситуаций. высокий уровень одновременности операций записи. Легко вызвать повторную попытку транзакции в течение длительного времени, что приводит к особенно медленному ответу клиента.

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

6.3 Пессимистическая блокировка

Каждый раз, когда он выполняется, он блокируется, а затем выполняется. Вы можете использовать select...fot. обновить реализацию. Что мы анализировали ранее синхронизированное ключевое слово、AQS-RentrantLock Все они относятся к пессимистическому типу блокировки, то есть блокировку необходимо получать перед каждым выполнением, после чего выполнение может продолжаться. Исключительная блокировка в базе данных является типичным пессимистическим типом блокировки.

существоватьбаза данныхсерединахочу использоватьпессимистический замок, то есть добавление эксклюзивности к сделке замокfor updateПрямо сейчас Может,Больше никаких подробностей

7. Правила блокировки

Правила блокировки данных в MySQL можно свести к следующим трем типам:

два принципа

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

Две оптимизации

  • Эквивалентный запрос по индексу при блокировке уникального индекса, следующий ключ блокировка перерождается в блокировку строки
  • Запрос эквивалентности по индексу, при переходе вправо и последнем значении не соответствует условию равенства, следующий ключ lockдеградировал в замок зазора

ОШИБКА

  • Запрос диапазона по уникальному индексу получит доступ к первому значению, которое не соответствует условию

В таблице t нет записи с id=7. Согласно принципу 1 единицей блокировки является блокировка следующего ключа, а диапазон блокировки сеанса A равен (5,10];

Согласно оптимизации 2, это эквивалентный запрос (id=7), а id=10 не соответствует условиям запроса. Блокировка следующего ключа перерождается в блокировку с пробелом, поэтому окончательный диапазон блокировки равен (5,10);

Следовательно, сеанс B будет заблокирован, если он вставит запись с id=8 в этот пробел, но сеанс C может изменить id=10.

  • ждать值ЗапросначальствоMySQLизоптимизация
    • Эквивалентный запрос по индексу, если это уникальный индекс, следующий ключ блокировка переродится в блокировку строки
    • Запрос эквивалентности по индексу (неуникальный обычный индекс), при переходе вправо и последнем значении не соответствует условию равенства, следующий ключ lockдеградировал в замок зазора

8. Резюме

Давайте суммируем различные блокировки, обсуждаемые в этой статье, а также конфликты и отношения совместимости между ними:

PS: Горизонтальное направление (строка) в таблице указывает на транзакцию, которая уже удерживает блокировку, а вертикальное направление (столбец) указывает на транзакцию, запрашивающую блокировку.

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

Общий временный замок с ключом

Эксклюзивный ключевой замок.

замок зазора

Общий временный замок с ключом

совместимый

конфликт

совместимый

Эксклюзивный ключевой замок.

конфликт

конфликт

совместимый

замок зазора

совместимый

совместимый

совместимый

Поскольку временная блокировка также заблокирует соответствующие данные строки, поэтому блокировка не будет повторяться в приведенной выше таблице. дизайн, и建Вседакизиз блокировка записи несовместимы, Та же причина, блокировка конфликтов записи тоже будут противоречивыми, давайте посмотрим на сравнение блокировок на уровне таблицы:

Сравнение блокировок на уровне таблицы

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

эксклюзивная блокировка намерений

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

глобальная блокировка

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

совместимый

совместимый

конфликт

конфликт

эксклюзивная блокировка намерений

совместимый

совместимый

конфликт

конфликт

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

конфликт

конфликт

конфликт

конфликт

глобальная блокировка

совместимый

конфликт

конфликт

конфликт

Глядя на это, вы действительно обнаружите, что на уровне таблицы существует множество конфликтов. Поскольку степень детализации блокировок относительно велика, конфликты будут возникать во многих случаях, но для блокировок на уровне таблицы нам нужно только сосредоточиться. наблокировка общего намеренияиобщийэксклюзивный замок Прямо сейчас Может,другойиз大много数为MySQLиз Скрытый Замок(существоватьздесь,блокировка общего намеренияиэксклюзивная блокировка намерений,Это также можно понимать какMyISAMсерединаизповерхностьчитать Замокиповерхность Писать Замок)。

поверхностьсерединаизконфликтисовместимыйпосле всегода Что это значит?конфликтизиметь в видудакогдаодинделаT1持иметь某个Замокчас,另одинделаT2Приходитьпопросить того жеиз Замок,T2встречапотому что Замокисключатьвстреча陷入阻塞ждать Состояние ожидания。Напротив Та же причина,Совместимый означает разрешение нескольким транзакциям одновременно получить одну и ту же блокировку.

ссылка Видео и заметки, связанные с Dark Horse Programmer、Механизм блокировки MySQL: как обеспечить безопасность чтения и записи данных в сценариях с высоким параллелизмом?

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose