14.16.2.2 Информация о блокировках и ожидании блокировок InnoDB
Когда транзакция обновляет строку в таблице или блокирует ее с помощью SELECT FOR UPDATE, InnoDB создаёт список или очередь блокировок на этой строке. Аналогично, InnoDB поддерживает список блокировок на таблице для блокировок на уровне таблицы. Если вторая транзакция хочет обновить строку или заблокировать таблицу, уже заблокированную предыдущей транзакцией в несовместимом режиме, InnoDB добавляет запрос на блокировку строки в соответствующую очередь. Для того, чтобы транзакция получила блокировку, все несовместимые запросы на блокировку, ранее добавленные в очередь блокировок для этой строки или таблицы, должны быть удалены (что происходит, когда транзакции, удерживающие или запрашивающие эти блокировки, либо завершают работу, либо откатываются).
Транзакция может иметь любое количество запросов на блокировку для разных строк или таблиц. В любой момент транзакция может запросить блокировку, удерживаемую другой транзакцией, в этом случае она блокируется этой другой транзакцией. Запрашивающая транзакция должна ждать, пока транзакция, удерживающая блокирующую блокировку, завершит работу или откатится. Если транзакция не ждёт блокировку, она находится в состоянии RUNNING. Если транзакция ждёт блокировку, она находится в состоянии LOCK WAIT. (Таблица INFORMATION_SCHEMA INNODB_TRX показывает значения состояния транзакций.)
Таблица INNODB_LOCKS содержит одну или несколько строк для каждой LOCK WAIT транзакции, указывающих на любые запросы на блокировку, препятствующие её работе. Эта таблица также содержит одну строку, описывающую каждую блокировку в очереди блокировок, ожидающих для данной строки или таблицы. Таблица INNODB_LOCK_WAITS показывает, какие блокировки, уже удерживаемые транзакцией, блокируют запросы на блокировку других транзакций.
© 2025 Oracle
Licensed under the GPLv2 License.