2013-12-08 54 views
1

我有一個策略實體,根據MySQL中的整數列自動生成一個id。事情可行,但在測試異常和相關回滾時,我注意到MySQL不會重置最後增加的值。如何控制自動增量ID?

所以一個成功的保存生成實體ID 1 嘗試保存獲取實體ID 2但回滾。 然後成功保存一個新實體獲取實體ID 3.

因此,在表中我們有兩個記錄。一個用id 1,另一個用id 3。

有沒有什麼辦法可以控制這個?基本上,在我剛剛描述的場景中,我希望看到兩個實體:一個id設置爲1,另一個id設置爲2.

+0

閱讀此:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html –

+0

通常一個不想要你想要的。假設您想要記錄關於回滾的實體(複雜事務的一部分)的一些關鍵信息。以後會有一個獨特的日誌條目,這一點非常重要。 –

回答

1

自動遞增數字必須是唯一的,但它們不必是連續的。它們是單調增加的,只是它們實現的巧合。

您可以隨時插入特定值並繞過自動遞增機制。但是你必須知道「下一個」值是多少。爲避免競爭條件,您必須鎖定表格,查詢MAX(id)+1,然後插入該值。

而這正是MySQL自己也必須這樣做的。

自動遞增工作的方式現在允許在沒有競爭條件的情況下實現最大的併發性。因此,設計時,它會不時地「丟失」一些值,當您回滾INSERT時,或者如果您隨後刪除了某個值。

2

不,您不能改變這種情況。這就是應該如此。

自動增量ID必須是唯一的。就這樣。

-1

您可以使用自己的自動增量邏輯處理它。 有一個Max + 1 idgenerator或有一個表維護這些表的PK自動生成的ID。 這樣

LASTKEY表名 1 TableX的 5 TableY

每次一個表,你會從這個表來查詢,以獲得遞增的ID。

+0

感謝您的想法,但我認爲這隻適用於單一連接。只要我們有兩個併發事務要求下一個ID,我們就會遇到問題。 – jacekn