2012-11-06 30 views
6

我正在開發一個積分系統,它可以爲我的網站上的用戶提供基於積分的排名,每當有人檢查他的個人資料頁時,我都會給用戶+1積分。假設用戶有200點,在同一個確切的時間10個用戶檢查他的個人資料頁,從我的理解代碼將得到200加1,結果將是200 + 1 = 201,如果10個用戶在同一時間,數據庫將如何運作?如何將一個數字添加到mysql中的當前值(同時多次)?

邏輯上它只會計數一次訪問,因爲用戶檢查配置文件的時間值爲200,所以當發生MYSQL更新時,它將始終爲201.我是否正確?

回答

17

如果您選擇現有的點數,請在客戶端添加一個點,然後再將更新的值寫回數據庫,然後您有race condition。正如你指出的那樣,有些觀點可能不會被計算在內。

相反,你應該嘗試使用原子更新,避免了問題:

UPDATE user SET points = points + 1 WHERE id = 42 

另一種方法是用SELECT ... FOR UPDATE閱讀。從documentation

如果FOR UPDATE使用與使用頁面或行鎖的存儲引擎,查詢檢驗的行是寫鎖定,直到當前事務結束。使用LOCK IN SHARE MODE設置一個共享鎖,允許其他事務讀取已檢查的行,但不更新或刪除它們。請參見第14.2.8.3節「選擇...以更新並選擇...鎖定分享模式鎖定讀取」

相關問題