2014-10-07 53 views
3

我在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

有問題嗎?如果這就是你的想法,它不會從0重新初始化計數器。 – 2014-10-07 15:06:38

+0

@ N.B的一個大問題。我正在使用一個envers審計表..我得到儘可能多的錯誤,我刪除了許多最後一行。因爲當我在主表中創建新行時,在ID已經存在的審計表中。 – gipinani 2014-10-07 15:08:36

+0

我明白了,這意味着我之前評論的錯誤,應該被忽略。我必須承認我沒有這個問題(並且我經常重新啓動MySQL)。只是爲了確定,你所做的只是重新啓動MySQL服務而不做任何事情 - 它試圖從開始啓動auto_increment,或者你是否嘗試手動重置它? – 2014-10-07 15:16:33

回答

0

這種類型的數據庫的簡單解決方案是利用軟刪除而不是物理刪除。

軟刪除是您向表中添加一個字段的位置,該字段用作狀態/指示符,以確定該行是否被視爲「活動」或「非活動」。由此,您將所有查詢都基於您的表格,其中指標列等於「活動」哨點值,忽略不活動的值。

還有其他選項可用,但這很容易實現。