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

5.4.4.1. Традиционный InnoDB Автоинкрементная Блокировка

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

Если Вы определяете AUTO_INCREMENT столбец для InnoDB таблица, табличный дескриптор в InnoDB словарь данных содержит специальный счетчик, названный автоинкрементным счетчиком, который используется в присвоении новых значений для столбца. Этот счетчик сохранен только в оперативной памяти, не на диске.

InnoDB использует следующий алгоритм, чтобы инициализировать автоинкрементный счетчик для таблицы t это содержит AUTO_INCREMENT столбец называют ai_col: После запуска сервера, для первой вставки в таблицу t, InnoDB выполняет эквивалент этого оператора:

SELECT MAX(ai_col) FROM t FOR UPDATE;

InnoDB постепенно увеличивает значение, полученное оператором, и присваивает это столбцу и автоинкрементному счетчику для таблицы. По умолчанию значение постепенно увеличивается одним. Это значение по умолчанию может быть переопределено auto_increment_increment параметр конфигурации.

Если таблица пуста, InnoDB использует значение 1. Это значение по умолчанию может быть переопределено auto_increment_offset параметр конфигурации.

Если a SHOW TABLE STATUS оператор исследует таблицу t прежде, чем автоинкрементный счетчик инициализируется, InnoDB инициализирует, но не постепенно увеличивает значение и хранит, оно для использования позже вставляет. Эта инициализация использует нормальное монопольно блокирующее чтение на таблице, и блокировка длится до конца транзакции.

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

После того, как автоинкрементный счетчик был инициализирован, если Вы явно не определяете значение для AUTO_INCREMENT столбец, InnoDB постепенно увеличивает счетчик и присваивает новое значение столбцу. Если Вы вставляете строку, которая явно определяет значение столбца, и значение больше чем текущее встречное значение, счетчик устанавливается в указанное значение столбца.

Если пользователь определяет NULL или 0 для AUTO_INCREMENT столбец в INSERT, InnoDB обрабатывает строку, как будто значение не было определено и генерирует новое значение для нее.

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

Получая доступ к автоинкрементному счетчику, InnoDB использует специальное предложение, на уровне таблицы AUTO-INC блокировка, что это придерживается конца текущего SQL-оператора, не до конца транзакции. Специальная стратегия выпуска блокировки была представлена, чтобы улучшить параллелизм для вставок в таблицу, содержащую AUTO_INCREMENT столбец. Однако, две транзакции не могут иметь AUTO-INC соедините ту же самую таблицу одновременно, которая может оказать влияние производительности если AUTO-INC блокировка сохранена в течение долгого времени. Это могло бы иметь место для оператора такой как INSERT INTO t1 ... SELECT ... FROM t2 это вставляет все строки от одной таблицы в другого.

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

Перезапуск сервера также отменяет эффект AUTO_INCREMENT = N табличная опция в CREATE TABLE и ALTER TABLE операторы, с которыми можно использовать InnoDB таблицы, чтобы установить начальное встречное значение или изменить текущее встречное значение.

Можно видеть разрывы в последовательности значений, присвоенных AUTO_INCREMENT столбец, если Вы откатываете транзакции, которые генерировали числа, используя счетчик.