Тайна MySQL (5): запрос типа и состояния блокировок InnoDB

база данных SQL
Тайна MySQL (5): запрос типа и состояния блокировок InnoDB

 Блокировка — ключевая функция, отличающая систему баз данных от файловой системы. Базы данных используют блокировки для поддержки одновременного доступа к общим ресурсам, обеспечивая целостность и согласованность данных. Кроме того, изоляция транзакций базы данных также достигается за счет блокировок. В этом отношении InnoDB неизменно превосходит другие механизмы баз данных. InnoDB блокирует табличные данные на уровне строк, тогда как MyISAM может блокировать только на уровне таблицы.Разницу в производительности между ними можно представить.

Блокировки в механизме хранения InnoDB

  Механизм хранения InnoDB реализует следующие две стандартные блокировки на уровне строк:

  • Общая блокировка (S Lock), которая позволяет транзакции читать строку
  • Эксклюзивная блокировка (X Lock), которая позволяет транзакции удалять или обновлять строку данных.

Если транзакция T1 получила совместную блокировку строки r, то другая транзакция T2 может немедленно получить совместную блокировку строки r, так как чтение не изменяет данные и могут выполняться параллельные операции чтения; но если другие транзакции T3 Если вы хотите получить эксклюзивную блокировку строки r, вы должны дождаться, пока транзакции T1 и T2 снимут общую блокировку строки r, прежде чем продолжить, потому что получение эксклюзивных блокировок обычно связано с изменением данных, поэтому чтение или другие операции записи не могут быть выполнены. в то же время.

X S
X несовместимый несовместимый
S несовместимый совместимый

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

  Блокировка намерения механизма хранения InnoDB — это блокировка на уровне таблицы. Цель разработки в основном состоит в том, чтобы выявить в рамках транзакции тип блокировки, которая будет запрошена для следующей строки. Он поддерживает два типа блокировки намерения:

  • Преднамеренная общая блокировка (блокировка IS), транзакция хочет получить общую блокировку определенных строк в таблице.
  • Преднамеренная монопольная блокировка (блокировка IX), транзакция хочет получить монопольную блокировку определенных строк в таблице.

  Следует отметить, что блокировка намерения — это блокировка на уровне таблицы, которая не будет конфликтовать с блокировками X и S на уровне строк. Он будет конфликтовать только с X и S на уровне таблицы. Таким образом, совместимость блокировок намерения на уровне таблицы и блокировок на уровне таблицы показана в следующей таблице.

IS IX S X
IS совместимый совместимый совместимый несовместимый
IX совместимый совместимый несовместимый несовместимый
S совместимый несовместимый совместимый несовместимый
X несовместимый несовместимый несовместимый несовместимый

При добавлении блокировки X на уровне таблицы к таблице (выполнение ALTER TABLE, DROP TABLE, LOCK TABLES и т. д.), если преднамеренной блокировки нет, вам нужно просмотреть всю таблицу, чтобы определить, есть ли блокировка строки для избегать конфликтов. Если имеется блокировка по намерению, необходимо только оценить, совместима ли блокировка по намерению с добавляемой блокировкой на уровне таблицы. Поскольку наличие намеренной блокировки означает, что существует блокировка на уровне строки или она должна быть установлена, результат может быть получен без обхода всей таблицы.

层次结构.jpg

 Если заблокированный объект рассматривается как дерево, то блокируется самый нижний объект, то есть блокируется наиболее мелкозернистый объект, тогда сначала необходимо блокировать крупнозернистый объект. Как показано на рисунке выше, если блокировку X необходимо применить к строке m записи m в таблице 1, то сначала необходимо применить преднамеренную блокировку IX к таблице 1, а затем блокировку X применить к строке m записи m в таблице 1. запись м. Если какая-либо из этих частей приводит к ожиданию, операция должна дождаться завершения грубой блокировки.

Запрос состояния, связанный с блокировкой InnoDB

 Пользователи могут использовать таблицы INNODB_TRX, INNODB_LOCKS и INNODB_LOCK_WAITS в библиотеке INFOMATION_SCHEMA для мониторинга текущих транзакций и анализа возможных проблем с блокировкой. Определение INNODB_TRX показано в следующей таблице, состоящей из 8 полей.

имя поля иллюстрировать
trx_id Уникальный идентификатор транзакции в механизме хранения InnoDB
trx_state статус текущей транзакции
trx_started время начала транзакции
trx_request_lock_id Идентификатор блокировки ожидающей транзакции. Если состояние trx_state — LOCK WAIT, то это поле представляет идентификатор ресурса блокировки, занятый текущей транзакцией, ожидающей предыдущей транзакции.
trx_wait_started время ожидания транзакции
trx_weight Вес транзакции отражает количество строк, измененных и заблокированных транзакцией. Когда возникает взаимоблокировка и требуется откат, для отката будет выбрано наименьшее значение.
trx_mysql_thread_id Идентификатор потока, результат, отображаемый SHOW PROCESSLIST
trx_query Оператор SQL, который выполняет транзакция
mysql> SELECT * FROM information_schema.INNODB_TRX\G;
************************************* 1.row *********************************************
trx_id:  7311F4
trx_state: LOCK WAIT
trx_started: 2010-01-04 10:49:33
trx_requested_lock_id: 7311F4:96:3:2
trx_wait_started: 2010-01-04 10:49:33
trx_weight: 2
trx_mysql_thread_id: 471719
trx_query: select * from parent lock in share mode

  Таблица INNODB_TRX может отображать только текущие транзакции InnoDB и не может напрямую судить о некоторых ситуациях блокировок. Если вам нужно просмотреть блокировки, вам также необходимо получить доступ к таблице INNODB_LOCKS, поля которой составлены, как показано в следующей таблице.

имя поля иллюстрировать
lock_id идентификатор замка
lock_trx_id номер транзакции
lock_mode режим блокировки
lock_type Тип блокировки, блокировка таблицы или блокировка строки
lock_table стол должен быть заперт
lock_index заблокированный индекс
lock_space идентификатор заблокированного пространства
lock_page Количество страниц, заблокированных транзакцией, или NULL, если это блокировка таблицы.
lock_rec Количество строк, заблокированных транзакцией, или NULL, если это блокировка таблицы.
lock_data Транзакция блокирует значение первичного ключа записи. Если это блокировка таблицы, значение равно NULL.
mysql> SELECT * FROM information_schema.INNODB_LOCKS\G;
*************************************** 1.row *************************************
lock_id: 7311F4:96:3:2
lock_trx_id: 7311F4
lock_mode: S
lock_type: RECORD
lock_table: 'mytest'.'parent'
lock_index: 'PRIMARY'
lock_space: 96
lock_page: 3
lock_rec: 2
lock_data: 1

 После проверки состояния блокировки каждой таблицы с помощью таблицы INNODB_LOCKS пользователь может судить о ситуации ожидания, вызванной этим. В то время, когда объем транзакций был очень большим, а также часто возникали блокировки и ожидания, в это время было не так просто судить. Однако через таблицу INNODB_LOCK_WAITS можно интуитивно отразить ожидание текущей транзакции. Таблица INNODB_LOCK_WAITS состоит из четырех полей, как показано в следующей таблице.

имя поля иллюстрировать
requesting_trx_id Идентификатор транзакции запрошенного ресурса блокировки
requesting_lock_id ID примененной блокировки
blocking_trx_id Идентификатор заблокированной транзакции
blocking_lock_id ID заблокированного замка
mysql> SELECT * FROM information_schema.INNODB_LOCK_WAITS\G;
*******************************************1.row************************************
requesting_trx_id: 7311F4
requesting_lock_id: 7311F4:96:3:2
blocking_trx_id: 730FEE
blocking_lock_id: 730FEE:96:3:2

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

постскриптум

  Мы узнаем о последовательном неблокирующем чтении InnoDB в будущем, пожалуйста, продолжайте обращать внимание.