План A: Просто используйте AUTO_INCREMENT
. Поскольку вы хотите один поток идентификаторов, у вас должна быть одна таблица, в которой генерируется id
. Это не так много, чтобы беспокоиться о. Предостережение: В среде с несколькими основными устройствами (включая Galera / Group Replication) среда AUTO_INCREMENT
не является последовательной. Предостережение: старайтесь избегать INSERT IGNORE
, REPLACE
, IODKU и других команд, которые могут записывать идентификаторы.
План B: иметь таблицу, выделенную только для этой задачи с порядковым номером. Напишите сохраненную функцию, чтобы получить следующий номер. Назовите его в своей собственной транзакции. Это сведет к минимуму влияние на другие действия.
Оба вышеперечисленных избегают дублирования. Однако вы не можете предотвратить пропущенные номера. Тем не менее, есть некоторые вещи, которые нужно сделать, чтобы не пропускать цифры. Минимизируйте потребность в ROLLBACK
. Если вы делаете ROLLBACK
, вам, вероятно, следует применить потерянный идентификатор к «аннулированному» счету. Это может сделать бухгалтеров и аудиторов счастливее.
Другая проблема: если вы используете репликацию, вы не можете гарантировать, что номера будут отображаться на ведомых устройствах монотонно. Это связано с тем, что захват идентификатора выполняется рано, но репликация происходит в COMMIT
порядке.
Я голосую за План B (который может включать AUTO_INCREMENT
под обложками). Это дает вам централизованное место для внесения следующего изменения, которое попросят менеджеры.