2013-06-04 82 views
0

在我們的應用中,當用戶創建一個訂單,我們得到一個訂單#如下:防止重複的數據鎖定或交易?

SELECT MAX(CAST(REPLACE(orderNum, 'SO', '') AS SIGNED)) + 1 FROM orders 

的問題是,因爲客戶越來越忙,我們開始看到,在準確創建訂單導致重複訂單#的同一時間。

處理這個問題的最佳方法是什麼?我們應該鎖定整個訂單表還是僅鎖定行?或者我們應該做交易?

+1

爲什麼不讓MySQL爲您生成訂單號,方法是將訂單設爲[auto_increment](http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html)ing首要的關鍵? –

+0

使用max()生成下一個id從開始就有缺陷,並且在併發事務時不正確或者不會伸縮。使用DBMS的內置功能來生成數字。 –

回答

0

您可以創建一個額外的表,只有一個字段具有auto_increment屬性。 現在,每次你需要一個新的訂單號時,你都會調用一個函數來在這個表中創建一個字段,並返回last_insert_id()的結果,然後你可以用它作爲訂單號(只要確保設置auto_increment計數器該表比你的最大訂單號高)。

+0

訂單號與訂單表中的主鍵分開。所以你可以orderID = 1,orderID = 2但他們都可以有相同的順序# - 這就是問題所在。我想避免爲此添加表格。 – drschultz

+0

@drschultz還有其他方法可以做到這一點,但它們都涉及您要求避免的種類鎖定和交易。用auto_increment向表中插入一行是我知道的唯一的原子指令,可以避免與這些類型的東西混淆。是否需要額外的表取決於您的數據庫佈局,我們不知道任何關於。 – Hazzit