Получает ли многострочная вставка MySQL последовательные идентификаторы автоинкремента? - PullRequest
8 голосов
/ 13 декабря 2011

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

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

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

Спасибо.

Ответы [ 3 ]

9 голосов
/ 13 декабря 2011

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

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

Подробнее о параметре innodb_autoinc_lock_mode см. 13.6.4.3.AUTO_INCREMENT Обработка в InnoDB

4 голосов
/ 13 декабря 2011

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

Пример:

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

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

2 голосов
/ 13 декабря 2011

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

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

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

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