2012-10-16 30 views
0

我在我的站點中使用此查詢以獲取下一個自動遞增,但問題是兩個或多個連接可以同時運行此查詢,並且它們都具有相同的AUto - 增值。停止運行相同查詢的兩個連接

SHOW TABLE STATUS LIKE 'TABLE_ORDERS'; 

有什麼辦法,我可以從在同一時間運行此查詢停止兩個或多個連接?

很多感謝!

Edit 

此自動增量的值然後用於將記錄存儲在另一個「收據」表中。如果兩個連接從Orders表中獲得相同的自動增量值,則最終在Receipt表中有兩行具有相同的值。

+1

你爲什麼要這樣做?把它作爲連接的責任。無論如何,任何被允許運行這樣的查詢的應用程序都應該在你自己的控制中。 – GolezTrol

+0

也許你需要澄清你的問題。自動增量的要點是您不必擔心管理多個連接,數據庫引擎會確保每條記錄都具有唯一的值。你不應該問下一個自動增量值,然後強制它。只要讓db設置它。 – Jay

+0

@Jay我添加了一些信息。可能會有助於更好地解釋這種情況。 –

回答

1

你不應該直接使用自動遞增值,因爲這將不可避免地導致各種你所描述的競爭條件。

相反,您應該插入一條記錄並檢查LAST_INSERT_ID()以查看哪個標識符已發佈到您的行。這個值然後可以安全地轉換到其他表中。

好消息是LAST_INSERT_ID()值表示在每個連接的基礎上插入最後一行的ID,所以應該沒有競爭條件的風險。

+0

好吧,我明白了。所以這個問題不在代碼中,問題是我正在實現的從Orders表到Receipt表中獲取記錄的邏輯? –

+0

執行您的INSERT,然後選擇插入的ID,然後將其添加爲關聯記錄的值之一。稍後,您可以選擇並「加入」這些。 – tadman

+0

如果您使用Java進行編碼,則JDBC具有內置函數來檢索生成的密鑰 - Statement.getGeneratedKeys。我更喜歡通過特定於數據庫的方法來使用它,因爲它允許我使用相同的方法,而不管使用哪個數據庫引擎 - 學習的東西更少。如果你使用的任何編程語言都沒有內置函數,就必須使用特定於數據庫的方法,正如tadman所描述的那樣。 – Jay

1

你可以把一個存儲過程中,並在其中添加

SELECT SLEEP(2); 

當前一個查詢需要暫停時,比如從站重新連接到主站時,這非常有用。

MySQL SLEEP

+0

對不起,我心中有一個不同的問題,並最終要求別的。我現在已經做出了改變。謝謝。 –