我在mysql 5.5
上使用InnoDb
模式。mysql:服務器重啓後保持自動遞增計數器 - 不一致的envers審計表
mysql 5.5
指南指出:只要
InnoDB使用在內存中的自動增長計數器作爲服務器 運行。當服務器停止並重新啓動時,InnoDB將 計數器重新初始化爲表中第一個INSERT的每個表的計數器,如前面描述的 。
這對我來說是個大問題。我正在使用envers
來保持實體審覈。我得到的錯誤與我刪除的許多「最後一行」一樣多。
假設我開始將數據插入空表中。假設要插入10行。然後假設刪除最後的8.在我的表中,我將得到2個實體,分別爲ID 1和2。在審計表中,我將擁有所有10個實體,ID爲1到10:ID爲3到10的實體將有2個操作:創建操作和刪除操作。
自動增量計數器現在在主表中設置爲11。重新啓動mysql服務自動遞增計數器會變爲3.因此,如果我插入一個新的實體,它將以id 3保存。但在審計表中已經有一個id = 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生成的文件中沒有關於自動增量計數器的信息。因此恢復轉儲可能是一個問題!
有問題嗎?如果這就是你的想法,它不會從0重新初始化計數器。 – 2014-10-07 15:06:38
@ N.B的一個大問題。我正在使用一個envers審計表..我得到儘可能多的錯誤,我刪除了許多最後一行。因爲當我在主表中創建新行時,在ID已經存在的審計表中。 – gipinani 2014-10-07 15:08:36
我明白了,這意味着我之前評論的錯誤,應該被忽略。我必須承認我沒有這個問題(並且我經常重新啓動MySQL)。只是爲了確定,你所做的只是重新啓動MySQL服務而不做任何事情 - 它試圖從開始啓動auto_increment,或者你是否嘗試手動重置它? – 2014-10-07 15:16:33