2011年9月2日 星期五

MySQL : SELECT ... FOR UPDATE

之前公司有一個功能是負責商品搶購
也就是在某一段時間內,給會員用優惠的價格買東西
這個案例在電子商務的世界裡很常見
對於商品的可購買數量,若是在交易過程中,計算錯了
那可是會有一大堆客訴

那時該系統是使用MySQL
而商品的table是用InnoDB
我們必須在會員購買前,先確認商品的庫存數量
庫存>0的時候,我能才能賣
如果SQL是這樣寫
SELECT quantity FROM product WHERE id="商品編號";

再判斷quantity >0為true的話,就再更新賣掉後的數量
UPDATE products SET quantity = 5 WHERE id="商品編號";
 要是這樣寫的話,就挫起來了
我們必須在這段程式裡包一個交易(transaction)
並且將SELECT的後面再上 FOR UPDATE
才能避免產生race condition
修改如下:
SELECT quantity FROM product WHERE id="商品編號" FOR UPDATE; 
UPDATE products SET quantity = 5 WHERE id="商品編號";

沒有留言:

張貼留言