Возможно, это очень маловероятно для меня из-за проблем, которые могут возникнуть, но я решил, что я все равно задам вопрос ...Может ли автоинкрементный идентификатор когда-либо изменяться со значения средней транзакции при совершении?
Представьте себе транзакцию, в которой задействован идентификатор автоинкремента, и значение назначены. До COMMIT задействованный код кэширует копию назначенного идентификатора для последующей ссылки. Затем транзакция совершается.
Предполагая отсутствие прямого вмешательства клиента (удаление или изменение записи), есть ли какая-либо база данных или ситуация, которая когда-либо автоматически изменила бы значение идентификатора сразу после COMMIT, чтобы неверный кешированный идентификатор? Всегда ли безопасно кэшировать ID-транзакцию?
Один гипотетический случай, когда я могу себе представить, что это происходит, если какая-то реализация РСУБД необъяснимо решила, что необходимо иметь бесцельные и зависящие от времени значения автоинкремента (так как я вижу много примеров людей, желающих этого). В этом гипотетическом случае я могу представить, что некоторые магические перетасовки идентификаторов могут быть сделаны, чтобы заполнить пробелы, вызванные откатами после ID-присвоения в другой транзакции (или другой зазор пробела). Это приведет к аннулированию кэшированного значения.
Кто-нибудь знает о такой реализации или другом кеш-убийце?
+1 Хотя я думаю, что вы абсолютно правы в использовании автоначислений ... технически они по определению больше не являются суррогатным ключом, если вы намерены использовать значение для определения порядка создания: D – Matthew
В 'InnoDB', механизм транзакционного хранения, используемый 'MySQL', автоинкрементные идентификаторы могут быть повторно использованы. Если запись с наивысшим «id» удаляется и сервер перезапускается, следующая вставка в таблицу приведет к тому же «id». – Quassnoi