2012-12-31 41 views
1

我打算在我的網站上使用自動遞增的用戶ID。由於用戶數據將被拆分成多個表,我想知道在事務中自動遞增值的可靠性如何,即在註冊時在事務的表中插入一些初始值時,只需讓自動遞增器設置所有表中的ID還是應插入到一個表中,將插入的ID取入單獨的查詢中,並在隨後的插入中使用它,從而導致數據庫負載更高,僅用於創建用戶?交易中AUTO_INCREMENT的可靠性如何?

+0

定義「可靠」。插入重複主鍵實際上是不可能的,但是您的多語句替代方法需要非常小心的表鎖定。 –

+0

自動增量id的最大挑戰是如果你有多個環境,並且需要保持ID在同一值行上同步。就像查找表一樣。否則,他們一般工作正常。 – xQbert

回答

1

每次嘗試插入內容時,都會保留自動增量字段。

1:1:2個步驟的插入件更多或更少的前進保留下一個可用的自動增量鍵
2:與該保留的鍵

執行插入現在,如果事務回滾,唯一永遠不會回滾的是自動增量預留,導致自動增量列中出現空隙。正因爲如此,如果你試圖預測100%的自動增量是什麼,那麼這是不可能的。我知道auto_increment沒有其他問題,並且在幾乎所有情況下,依靠mysql的功能比嘗試手動執行某些操作更可靠。

0

如果您的插入是在非常受控制的條件下發生的,例如沒有併發事務,並且沒有任何事情會回滾,那麼您可能是安全的。否則,答案可能取決於您正在使用的存儲引擎。您應該預計auto_increment導致least if you are using InnoDB的編號出現空白。

更一般地,每一個DB我知道有差距的auto_increment的機會(或同等)值。原因是,如果不是這樣,插入新行的任何事務將不得不阻止對該表的所有其他插入。這是因爲如果第一個事務尚未提交或回退,無法知道下一個值將會是什麼,則無法插入第二行。如果你允許差距,那麼你只是假設第一個事務將會提交,如果它發生回滾,那麼你有一個缺口,但這不是問題。

如果您關注的是用戶創建操作高負荷,您可能能夠通過實現該功能的存儲過程,以使事情更迅捷;通過這種方式,您可以避免每次查詢返回到應用程序。

+0

請注意,差距絕不是問題。 –

+0

@ÁlvaroG.Vicario:我認爲他們是,如果你試圖預測產生了什麼數字,這似乎是問題所在。 –