在我們的應用中,當用戶創建一個訂單,我們得到一個訂單#如下:防止重複的數據鎖定或交易?
SELECT MAX(CAST(REPLACE(orderNum, 'SO', '') AS SIGNED)) + 1 FROM orders
的問題是,因爲客戶越來越忙,我們開始看到,在準確創建訂單導致重複訂單#的同一時間。
處理這個問題的最佳方法是什麼?我們應該鎖定整個訂單表還是僅鎖定行?或者我們應該做交易?
在我們的應用中,當用戶創建一個訂單,我們得到一個訂單#如下:防止重複的數據鎖定或交易?
SELECT MAX(CAST(REPLACE(orderNum, 'SO', '') AS SIGNED)) + 1 FROM orders
的問題是,因爲客戶越來越忙,我們開始看到,在準確創建訂單導致重複訂單#的同一時間。
處理這個問題的最佳方法是什麼?我們應該鎖定整個訂單表還是僅鎖定行?或者我們應該做交易?
您可以創建一個額外的表,只有一個字段具有auto_increment屬性。 現在,每次你需要一個新的訂單號時,你都會調用一個函數來在這個表中創建一個字段,並返回last_insert_id()的結果,然後你可以用它作爲訂單號(只要確保設置auto_increment計數器該表比你的最大訂單號高)。
爲什麼不讓MySQL爲您生成訂單號,方法是將訂單設爲[auto_increment](http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html)ing首要的關鍵? –
使用max()生成下一個id從開始就有缺陷,並且在併發事務時不正確或者不會伸縮。使用DBMS的內置功能來生成數字。 –