Я строю систему, которая требует хранить определенные записи с последовательным номером. На этом этапе AUTO INCREMENT работает просто отлично, пока не возникнет необходимость в ROLLBACKS: после того, как такая последовательная запись существует, я должен выполнить некоторые процессы, используя этот последовательный номер, и этот процесс может завершиться сбоем, что приведет к неизбежному ROLLBACK …
В следующий раз, когда я пытаюсь вставить запись, столбец AUTO INCREMENT не может использовать уже потерянный порядковый номер из-за определенных «неразрывных» правил из MySQL.
Я не могу использовать MAX(id) + 1
Кстати, потому что может быть другой пользователь в системе, выполняющий тот же процесс, сгенерировавший его / ее собственный / следующий последовательный идентификатор с успехом.
У меня есть идея по этому поводу: чтобы получить все последовательные идентификаторы в этой таблице и зациклить их с программой, чтобы найти первый отсутствующий идентификатор, хотя я не уверен в этом, потому что другой пользователь может сделать то же самое (и там может быть только 1 отсутствующий подряд, поэтому оба пользователя будут пытаться вставить, используя один и тот же последовательный …. и т. д. и т. д.)
Итак, мне нужно, чтобы эта последовательность была последовательной, даже если есть необходимость в ROLLBACK.
Есть ли какая-либо альтернатива AUTO INCREMENT (в MySQL, с PHP или чем-то еще), чтобы я мог генерировать последовательные идентификаторы согласованным образом, независимо от того, нужно ли мне ОТВЕРТАТЬ одну или две из этих вставок?.
Спасибо за любую помощь.
Прежде всего, нет декларативного способа делать то, что вы хотите. Вы должны написать процедурный код.
Я не могу использовать MAX (ID) + 1 способ
Да, ты можешь. Для начала вы должны написать код, который либо
В каждом подходе есть компромиссы, но оба могут поддерживать непрерывную последовательность чисел даже при наличии отката.
Но это еще не все. Вы также должны предотвратить изменения, нарушающие последовательность. Так что вы должен либо отмените обновление и удалите привилегии для этой таблицы, либо вы должны запретить обновление или удаление существующего идентификационного номера каким-либо другим способом.
Чтобы получить все последовательные идентификаторы в этой таблице и зациклить их
программа для поиска первого пропавшего идентификатора,
Если вы уже иметь нарушенная последовательность, лучше сначала исправить это.
Других решений пока нет …