2013-05-02 119 views
1

我必須使用表(行)中的每個元素的嚴格順序ID來創建MySQL InnoDB表。 ID中不能有任何空白 - 每個元素必須有不同的ID,並且它們必須按順序分配。併發用戶在此表上創建數據。在MySQL中嚴格自動增加值

我遇到過MySQL的「自動增量」行爲,如果一個事務失敗,PK號碼不會被使用,留下空隙。我已閱讀我希望最大限度地編寫併發網絡複雜的解決方案,並沒有說服我和其他一些是真的不解決我的問題(Emulate auto-increment in MySQL/InnoDBSetting manual increment value on synchronized mysql servers

  • 。我不能讓用戶在桌子上寫字,等待很長時間。
  • 我可能需要對錶格進行分片...但仍保留ID號。
  • 表中元素的順序並不重要,但ID必須是順序的(例如,如果元素是在另一個元素之前創建的,不需要具有較低的ID,但ID之間的間距不允許)。

我能想到的唯一解決方案是使用額外的COUNTER表來保持計數。然後用空的「ID」(不是PK)在表中創建元素,然後鎖定COUNTER表,獲取數字,將其寫入元素,增加數字,解鎖表格。我認爲這樣做可以正常工作,但有明顯的瓶頸:在鎖定期間,沒有人可以寫任何ID。 另外,如果持有該表的節點不可用,則是單點故障。我可以創建一個「主 - 主」?複製,但我不知道是否這樣我冒着使用過時的ID計數器(我從來沒有使用過複製)的風險。

謝謝。

+1

需要連續ID的性質是什麼?這是一個面向用戶的價值嗎?也許是因爲您將該ID傳遞給用戶。如果是這樣,我會創建一個代理ID值,您傳遞給用戶。這給你以後的設計靈活性。 你說「最大化寫入併發性」很重要,但是「不要等很長時間」會留下很多回旋餘地 - 與「最大化寫入併發性」非常不同。一個更容易,那是哪個呢? 將它定義爲「不要等很長時間」似乎可以讓你做一些額外的,但輕量級的工作來滿足你的要求。 – gillyspy 2013-05-03 04:12:46

+0

我寫了一個innodb差距答案[在這裏](http://stackoverflow.com/a/38363271) – Drew 2016-07-14 00:12:21

回答

2

我很抱歉地說這個,但是允許高併發性來實現高性能和在同一時間要求一個嚴格的單調序列是衝突的要求。

要麼你必須控制/單一故障點發出的ID,並確保有沒有重複,也不是一個跳過,你將不得不接受一個或這兩種情況的機會。

正如你所說的,有人試圖繞過這類問題,但最終你會發現你需要在速度和正確性之間進行權衡,因爲只要你允許併發,你就可以運行裂腦情況或種族狀況。

對於每一個可能很多的服務器/數據庫/表,可能是一個嚴格的單調序列嗎?

+0

我想你是對的...我知道併發+高可用性已知是不可能的。主要要求是對整個系統順序分配ID(無間隙,不重複)。也許我建議的解決方案是最明智的解決方案......優先考慮速度的正確性 – user1156544 2013-05-02 22:54:02

+0

高可用性不是您認爲的意思....至少不是根據您的意見。高併發性和保證唯一性相對容易,但保證連續性不是* andy * rdbms的共同特徵。我瞭解Oracle,DB2,Sybase,MySQL,MSSQLServer。這些都不能保證連續性。高可用性還有其他問題。 – rolfl 2013-05-02 23:05:57

+0

我的意思是強大的一致性和高數據可用性不能同時實現......要麼我會優先考慮一致性(總是獲得正確的ID,而是要鎖定其他訪問)或數據可用性(儘管不是「正確」一個)。在我的系統中,ID的正確性更重要......但我想知道是否還有其他「技巧」來提高寫作表現 – user1156544 2013-05-03 16:49:14