Захватывает ли многострочная вставка MySQL последовательные идентификаторы автоинкремента?

Я думаю, что это правда, но я не нашел ничего в Интернете, чтобы подтвердить это. Я могу получить первый идентификатор, сгенерированный для поля автоинкремента, с помощью last_insert_id(), но могу ли я предположить, что следующие записи будут иметь последовательные идентификаторы? Или другой пользователь может получить идентификатор, чтобы полученные идентификаторы не были последовательными?

Пример: вставить в mytable (asdf, qwer) значения (1,2), (3,4), (5,6), ... , (10000,10001);

Если в mytable есть столбец автоинкремента, и если два пользователя одновременно запускают этот оператор, получит ли один пользователь 10 000 последовательных идентификаторов, а другой пользователь — следующие 10 000 последовательных идентификаторов? Как насчет сотен пользователей?

Спасибо.


person SeanO    schedule 12.12.2011    source источник
comment
Это может быть правдой, но насколько я знаю, у вас нет таких гарантий.   -  person Nanne    schedule 13.12.2011


Ответы (3)


Это зависит от используемого механизма хранения.

  • MyISAM гарантирует, что вставленные строки будут иметь последовательные идентификаторы, поскольку во время вставки удерживается блокировка на уровне таблицы.
  • InnoDB: если для innodb_autoinc_lock_mode не установлено значение чередование (2), вставленные строки будут иметь последовательные идентификаторы. По умолчанию InnoDB работает в режиме consecutive, начиная с версии 5.1, и в режиме traditional ранее.

Дополнительные сведения о параметре innodb_autoinc_lock_mode см. в 13.6.4.3. . AUTO_INCREMENT Обработка в InnoDB

person The Scrum Meister    schedule 12.12.2011

Если вы используете LOCK TABLES, пакеты должны захватывать последовательные идентификаторы.

Пример:

LOCK TABLES users WRITE;
<BULK INSERT HERE>
UNLOCK TABLES;

Это предотвратит одновременную запись в таблицу нескольких потоков.

person Matt MacLean    schedule 12.12.2011
comment
Могу ли я использовать LOCK TABLES .. для механизма innodb? - person stack; 11.05.2016
comment
Да — LOCK TABLES работает с InnoDB. Ознакомьтесь с документацией по блокировке: dev .mysql.com/doc/refman/5.5/en/innodb-locking.html - person Matt MacLean; 16.05.2016

Многострочная вставка — это просто массовая операция, которая выполняет одну и ту же операцию снова и снова. Когда запускается оператор вставки, он запускает триггер, который генерирует идентификатор.

Таким образом, если используемый механизм базы данных выполняет всю свою работу последовательно (очередь, например - первый пришел - первый ушел), тогда да, последовательный идентификатор будет на один шаг выше, чем предыдущий идентификатор; если данные вставляются многопоточным способом, когда операторы запускаются параллельно, то нет, идентификаторы будут заданы «случайно».

Я не знаю ни одного движка mysql, который бы это гарантировал, но опять же, я не проводил много исследований по этому конкретному вопросу.

person Asser    schedule 12.12.2011