Я использую схему InnoDb
на mysql 5.5
.
mysql 5.5
руководство сообщает:
InnoDB использует счетчик автоинкремента в памяти, пока работает сервер. Когда сервер останавливается и перезапускается, InnoDB повторно инициализирует счетчик для каждой таблицы для первого INSERT в таблицу, как описано ранее.
Это большая проблема для меня. Я использую envers
для аудита сущностей. Я получаю столько ошибок, сколько «последних строк» удаляю.
Предположим, я начинаю вставлять данные в пустую таблицу. Предположим, что нужно вставить 10 строк. Затем предположим удалить последние 8. В моей таблице у меня будет 2 объекта с идентификаторами 1 и 2 соответственно. В таблице аудита у меня будут все 10 объектов с идентификатором от 1 до 10: у объектов с идентификатором от 3 до 10 будет 2 действия: создать действие и удалить действие.
счетчик автоинкремента теперь установлен на 11 в основной таблице. Перезапуск счетчика автоинкремента службы mysql становится равным 3. Поэтому, если я вставлю новый объект, он будет сохранен с идентификатором 3. Но в таблице аудита уже есть объект с идентификатором = 3. Этот объект уже помечен как созданный и удаленный . Это приводит к ошибке утверждения во время действия обновления/удаления, поскольку envers не может обработать это несогласованное состояние.
ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): java.lang.RuntimeException: Cannot update previous revision for entity Customer_H and id **.
Есть ли способ изменить это поведение и сохранить значения автоинкремента при перезапуске сервера?
Насколько я помню, в сгенерированном файле mysqldump нет информации о счетчике автоинкремента. Так что восстановление дампа тоже может быть проблемой!