Spec-Zone .ru
спецификации, руководства, описания, API

14.2.3.5. InnoDB Запись, Разрыв, и Следующие блокировки ключа

InnoDB имеет несколько типов блокировок на уровне записи:

Блокировки записи всегда блокируют, индексируют записи, даже если таблица определяется без, индексирует. Для таких случаев, InnoDB создает скрытый кластерный индекс и использует, это индексирует для захвата записей. См. Раздел 14.2.3.12.2, "Кластеризируемый и Вторичный Индексирует".

По умолчанию, InnoDB работает в REPEATABLE READ уровень изоляции транзакции и с innodb_locks_unsafe_for_binlog системная переменная отключается. В этом случае, InnoDB следующие блокировки ключа использования для поисков и индексируют сканирования, который предотвращает фантомные строки (см. Раздел 14.2.3.6, "Избегая Фантомной проблемы Используя Блокировку Следующего ключа").

Следующая ключевая блокировка комбинирует блокировку индексировать-строки с блокировкой разрыва. InnoDB выполняет привязку на уровне строки такого пути, которые, когда это ищет или сканирует таблицу, индексируют, это устанавливает коллективные или монопольные блокировки на индексировать записях, с которыми это встречается. Таким образом блокировки на уровне строки являются фактически блокировками индексировать-записи. Кроме того, следующая блокировка ключа на индексировать записи также влияет на "разрыв" прежде, чем это индексирует запись. Таким образом, следующая блокировка ключа является блокировкой индексировать-записи плюс разрыв, соединяют разрыв, предшествующий индексировать записи. Если у одного сеанса есть коллективная или монопольная блокировка на записи R в индексировании другой сеанс не может вставить новое, индексируют запись в разрыве сразу прежде R в индексировать порядке.

Предположите, что индексирование содержит значения 10, 11, 13, и 20. Возможные следующие блокировки ключа для этого индексируют покрытие следующие интервалы, где ( или ) обозначьте исключение конечной точки интервала и [ или ] обозначьте включение конечной точки:

(negative infinity, 10](10, 11](11, 13](13, 20](20, positive infinity)

Для последнего интервала следующая блокировка ключа блокирует разрыв выше самого большого значения в индексировании и псевдозаписи "supremum", имеющей значение выше чем любое значение фактически в индексировании. supremum не является вещественным числом, индексируют запись, таким образом, в действительности эти блокировки следующей блокировки ключа только разрыв после самого большого индексирует значение.

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

Блокировка разрыва не необходима для операторов, которые блокируют строки, используя уникальный индекс, чтобы искать уникальную строку. (Это не включает случай, что условие поиска включает только некоторые столбцы уникального индекса многократного столбца; в этом случае блокировка разрыва действительно происходит.) Например, если id у столбца есть уникальный индекс, следующий оператор использует только блокировку индексировать-записи для наличия строки id оцените 100, и не имеет значения, вставляют ли другие сеансы строки в предыдущий разрыв:

SELECT * FROM child WHERE id = 100;

Если id не индексируется или имеет групповое, индексируют, оператор действительно блокирует предыдущий разрыв.

Тип блокировки разрыва, названной блокировкой разрыва намерения вставки, устанавливается INSERT операции до вставки строки. Эта блокировка сигнализирует намерение вставить таким способом, которым многократные транзакции, вставляющие в то же самое, индексируют разрыв, не должен ожидать друг друга, если они не вставляют в той же самой позиции в пределах разрыва. Предположите, что есть, индексируют записи со значениями 4 и 7. Отдельные транзакции, которые пытаются вставить значения 5 и 6 каждых блокировок разрыв между 4 и 7 с блокировками намерения вставки до получения монопольной блокировки на вставленной строке, но не блокировать друг друга, потому что строки неконфликтуют.

Блокировка разрыва может быть отключена явно. Это происходит, если Вы изменяете уровень изоляции транзакции на READ COMMITTED или включите innodb_locks_unsafe_for_binlog системная переменная (который теперь осуждается). При этих обстоятельствах блокировка разрыва отключается для поисков, и индексируйте сканирования, и используется только для ограничительной проверки внешнего ключа и двойной ключевой проверки.

Есть также другие эффекты использования READ COMMITTED уровень изоляции или включение innodb_locks_unsafe_for_binlog: Блокировки записи для того, чтобы несоответствовать строки выпускаются после того, как MySQL оценил WHERE условие. Для UPDATE операторы, InnoDB делает "полунепротиворечивое" чтение, так, что оно возвращает последнюю переданную версию MySQL так, чтобы MySQL мог определить, соответствует ли строка WHERE условие UPDATE.