我在我的站點中使用此查詢以獲取下一個自動遞增,但問題是兩個或多個連接可以同時運行此查詢,並且它們都具有相同的AUto - 增值。停止運行相同查詢的兩個連接
SHOW TABLE STATUS LIKE 'TABLE_ORDERS';
有什麼辦法,我可以從在同一時間運行此查詢停止兩個或多個連接?
很多感謝!
Edit
此自動增量的值然後用於將記錄存儲在另一個「收據」表中。如果兩個連接從Orders表中獲得相同的自動增量值,則最終在Receipt表中有兩行具有相同的值。
我在我的站點中使用此查詢以獲取下一個自動遞增,但問題是兩個或多個連接可以同時運行此查詢,並且它們都具有相同的AUto - 增值。停止運行相同查詢的兩個連接
SHOW TABLE STATUS LIKE 'TABLE_ORDERS';
有什麼辦法,我可以從在同一時間運行此查詢停止兩個或多個連接?
很多感謝!
Edit
此自動增量的值然後用於將記錄存儲在另一個「收據」表中。如果兩個連接從Orders表中獲得相同的自動增量值,則最終在Receipt表中有兩行具有相同的值。
你不應該直接使用自動遞增值,因爲這將不可避免地導致各種你所描述的競爭條件。
相反,您應該插入一條記錄並檢查LAST_INSERT_ID()
以查看哪個標識符已發佈到您的行。這個值然後可以安全地轉換到其他表中。
好消息是LAST_INSERT_ID()
值表示在每個連接的基礎上插入最後一行的ID,所以應該沒有競爭條件的風險。
好吧,我明白了。所以這個問題不在代碼中,問題是我正在實現的從Orders表到Receipt表中獲取記錄的邏輯? –
執行您的INSERT,然後選擇插入的ID,然後將其添加爲關聯記錄的值之一。稍後,您可以選擇並「加入」這些。 – tadman
如果您使用Java進行編碼,則JDBC具有內置函數來檢索生成的密鑰 - Statement.getGeneratedKeys。我更喜歡通過特定於數據庫的方法來使用它,因爲它允許我使用相同的方法,而不管使用哪個數據庫引擎 - 學習的東西更少。如果你使用的任何編程語言都沒有內置函數,就必須使用特定於數據庫的方法,正如tadman所描述的那樣。 – Jay
對不起,我心中有一個不同的問題,並最終要求別的。我現在已經做出了改變。謝謝。 –
你爲什麼要這樣做?把它作爲連接的責任。無論如何,任何被允許運行這樣的查詢的應用程序都應該在你自己的控制中。 – GolezTrol
也許你需要澄清你的問題。自動增量的要點是您不必擔心管理多個連接,數據庫引擎會確保每條記錄都具有唯一的值。你不應該問下一個自動增量值,然後強制它。只要讓db設置它。 – Jay
@Jay我添加了一些信息。可能會有助於更好地解釋這種情況。 –