Введение
Блокировки MySQL можно разделить на глобальные блокировки, блокировки таблиц и блокировки строк в соответствии с их областью действия. Среди них блокировки строк реализуются ядром базы данных. Не все механизмы предоставляют блокировки строк. MyISAM не поддерживает блокировки строк, поэтому в статье представлены блокировки строк.В качестве примера для ознакомления возьмем движок InnoDB.
2. Глобальная блокировка
MySQL предоставляет глобальные блокировки для блокировки всего экземпляра базы данных.
грамматика:
FLUSH TABLES WITH READ LOCK
Эта инструкция обычно используется для резервного копирования.При выполнении этой инструкции все открытые таблицы в базе данных будут закрыты, а все таблицы в базе данных будут заблокированы глобальной блокировкой чтения.Операции определения данных (создание таблиц, изменение структуры таблиц) и фиксации транзакций для классов обновления заблокированы.
После mysql 8.0 для резервного копирования mysql может напрямую использовать резервную блокировку.
Заявление:
LOCK INSTANCE FOR BACKUP
UNLOCK INSTANCE
Эта блокировка имеет более широкую область действия, эта блокировка будет препятствовать созданию, переименованию, удалению файлов, в том числеREPAIR TABLE TRUNCATE TABLE, OPTIMIZE TABLE
Операции и управление аккаунтом заблокированы. Конечно, эти операции можно выполнять и для временных таблиц в памяти, но почему на таблицы в памяти не распространяются эти ограничения? Поскольку резервное копирование таблицы памяти не требуется, нет необходимости выполнять эти условия.
3. Блокировка стола
Блокировки уровня таблицы Mysql делятся на две категории: одна — блокировка метаданных (MDL), другая — блокировка таблицы.
Блокировка метаданных (MDL)Его не нужно использовать явно, он добавляется автоматически при доступе к таблице. Эта функция должна поддерживаться MySQL 5.5 или более поздней версии.При добавлении, удалении, изменении и запросе таблицы таблица будет добавлена с блокировкой чтения MDL, при изменении структуры таблицы будет добавлена блокировка записи MDL. . Блокировки MDL имеют некоторые правила:
- Блокировки чтения не являются взаимоисключающими, поэтому несколько потоков могут добавлять, удалять, изменять и запрашивать одну и ту же таблицу.
- Блокировки чтения-записи и блокировки записи являются взаимоисключающими.Чтобы обеспечить безопасность изменений структуры таблицы, если для добавления полей в одну и ту же таблицу и другие структуры таблиц требуется несколько потоков, они будут сериализованы и должны ждать блокировок. .
- Блокировка записи MDL имеет более высокий приоритет, чем блокировка чтения MDL, но системная переменная max_write_lock_count может изменить эту ситуацию.Когда запрос блокировки записи превышает число, установленное этой переменной, блокировка чтения MDL имеет более высокий приоритет, чем блокировка чтения MDL Блокировка записи MDL, высокий приоритет. (По умолчанию это число будет большим, поэтому не беспокойтесь о потере приоритета блокировок записи)
- Снятие блокировки MDL не должно быть снято до конца транзакции.
Поэтому мы должны быть осторожны, чтобы не использовать длинные транзакции при работе со структурой таблицы базы данных.Что это значит? Я приведу пример для иллюстрации:
На приведенном выше рисунке показана демонстрация 4 операторов выполнения сеанса. Сначала сеанс A открывает транзакцию без фиксации, а затем сеанс B выполняет запрос. Поскольку он получает блокировку чтения MDL, они не влияют друг на друга и могут выполняться в обычном режиме. новое поле, поскольку запись MDL и чтение являются взаимоисключающими, поэтому SessionC будет заблокирован, а затем SessionD начнет выполнять оператор запроса.Из-за блокировки SessionC, SessionD также будет заблокирован. Поэтому смоделированная нами транзакция SessionA является длинной транзакцией, а затем модификация структуры таблицы выполняется позже, что сделает все последующие операции чтения и записи в таблицу невыполнимыми. Поэтому в реальном сценарии при частых бизнес-запросах изменение структуры таблицы может привести к блокировке потоков библиотеки.
блокировка столаСинтаксис следующий:
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type: {
READ [LOCAL]
| [LOW_PRIORITY] WRITE
}
UNLOCK TABLES
Блокировки таблицы делятся на блокировки чтения и блокировки записи., блокировки чтения не являются взаимоисключающими, но получение блокировки чтения не может записывать данные, и другие сеансы, которые не получили блокировку чтения, также могут читать таблицу, поэтому цель блокировки чтения состоит в том, чтобы ограничить запись в таблицу. Если таблица заблокирована блокировкой чтения, то выполнение оператора вставки сообщит об ошибке, ошибка выглядит следующим образом:
1099 - Table 'XXXX' was locked with a READ lock and can't be updated
блокировка записиПосле получения таблица может быть прочитана и записана, и блокировка записи является взаимоисключающей.После того, как сеанс получает блокировку записи таблицы, другие сеансы не могут получить доступ к таблице, пока блокировка записи не будет снята.
Разблокировку стола можно использоватьunlock tables
Разблокировать, или клиентский порт может быть автоматически разблокирован.lock tables
Таблица блокировок будет блокировать исключительно таблицу.Помимо ограничения других потоков на чтение и запись в таблицу, она также ограничивает следующие объекты операций этого потока.
В-четвертых, блокировка строк (InnoDB)
Блокировка строки в MySQL реализована на уровне движка, поэтому здесь также обсуждается блокировка строки в движке InnoDB.Далее будет подробно представлено несколько распространенных блокировок строк в InnoDB.
4.1 Общие замки
Общие блокировки позволяют транзакциям выполнять операции чтения после получения блокировки. Общие блокировки не являются взаимоисключающими. После того, как транзакция получает общую блокировку, другая транзакция также может получить общую блокировку, но не может выполнять операции записи после получения общей блокировки.
4.2 Эксклюзивный замок
Эксклюзивная блокировка позволяет транзакции обновить или удалить строку после получения блокировки. Исключительная блокировка, как следует из ее названия, является взаимоисключающей. выпущен.
4.3 Блокировка намерения
InnoDB поддерживает несколько уровней детализации блокировок, что позволяет сосуществовать блокировкам строк и блокировкам таблиц, как упоминалось здесь.Блокировка намерения на самом деле является блокировкой на уровне таблицы., но я поместил его в блокировку строки, потому что он не будет существовать один, его появление обязательно будет сопровождаться блокировками строк (разделяемыми блокировками или эксклюзивными блокировками), и его основное назначение - указать, что строки в таблице будут заблокированы или заблокированная строка в таблице.
По сочетанию блокировок намерений и блокировок строк их можно разделить на:
-
Преднамеренная эксклюзивная блокировка: указывает, что эксклюзивная блокировка будет получена для некоторых строк в таблице.
-
Предполагаемая общая блокировка: указывает, что общая блокировка будет получена для некоторых строк в таблице.
Блокировка намерения должна быть получена до того, как будет получена блокировка строки, то есть блокировка общего намерения должна быть получена до того, как будет получена общая блокировка, и то же самое верно для монопольной блокировки.
Итак, что именно делает эта блокировка намерения?
Прежде чем объяснять это, давайте взглянем на отношения совместимости между блокировками намерений и блокировками строк:
- | Эксклюзивный замок (X) | Преднамеренная эксклюзивная блокировка (IX) | Общий замок(S) | Общая блокировка намерений (IS) |
---|---|---|---|---|
Эксклюзивный замок (X) | конфликт | конфликт | конфликт | конфликт |
Преднамеренная эксклюзивная блокировка (IX) | конфликт | совместимый | конфликт | совместимый |
Общий замок(S) | конфликт | конфликт | совместимый | совместимый |
Общая блокировка намерений (IS) | конфликт | совместимый | совместимый | совместимый |
Предположим, что есть две транзакции A и B. Транзакция A получает общую блокировку и блокирует строку в таблице. Эта строка доступна только для чтения и не может быть записана. Теперь транзакция B должна применить блокировку записи для всей таблицы. . Если транзакция B применяется успешно, то должна быть возможность записи во все строки таблицы, поэтому она должна конфликтовать с блокировкой строки, полученной A. Чтобы избежать таких конфликтов, база данных будет выполнять обнаружение конфликтов, так как же их обнаружить? Есть два способа:
- Определяет, была ли таблица заблокирована другой транзакцией с блокировкой на уровне таблицы.
- Определите, заблокирована ли каждая строка в таблице блокировкой строки.
Каждая строка в таблице суждений должна пройти через все записи, что слишком неэффективно, поэтому база данных использует первый метод для обнаружения конфликтов, то есть используется блокировка намерения.
Суммировать
В этой статье в основном анализируются блокировки MySQL из области блокировки MySQL.MySQL можно разделить на глобальные блокировки, блокировки таблиц и блокировки строк в соответствии с областью блокировки. Глобальные блокировки и блокировки таблиц реализованы самой MySQL, а блокировки строк реализованы на уровне движка. Блокировки строк в InnoDB в основном делятся на общие блокировки и эксклюзивные блокировки. После запроса общей блокировки строку можно только прочитать, а общие блокировки не являются взаимоисключающими. После получения эксклюзивной блокировки строку можно обновить и удалить, а эксклюзивная блокировка является взаимоисключающей с другими блокировками. Наконец, я упомянул блокировку по намерению на основе блокировки строки.Блокировка по намерению в основном означает, что строка заблокирована или вот-вот будет заблокирована, чтобы повысить эффективность обнаружения конфликтов блокировок. Конечно, в InnoDB есть и другие блокировки, такие как блокировки промежутка, блокировки записи, блокировки Next-Key и т. д., которые не рассматриваются в этой статье Заинтересованные студенты могут изучить их самостоятельно.
Ссылаться на
-
«45 практических лекций по MySQL»