拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
你這個應用場景很像是:
修改用戶餘額前,因為怕修改出問題,意外把用戶餘額改為0什麼的。 而選擇先插入一筆記錄到使用者帳務變動表,然後查出帳務變更表的數據,來更新使用者餘額欄位。
用一個成語形容這種行為:「慌不擇路」
你有沒有想過,既然你擔心用戶餘額修改時出問題,那麼你也同樣要擔心用戶帳變表插入出問題,那是不是還要另一個表來保證帳變表呢?那另一個表誰來保證呢?
其實,你應該知道正確的解決方法。而不是用兩個不安全的辦法來湊成1個安全的辦法。你這樣做,不但沒有得到1個安全的辦法,反而得到了兩個不安全的辦法。
正確的方法是,直接修改使用者餘額表,並且加上排它鎖。例如:
// 开始事物 BEGIN ; // 取出该用户数据,并锁住,防止其他线程(进程)读取该条记录 SELECT * FROM users where id = $id FOR UPDATE ; // 处理业务...计算用户新的余额 // 更新用户余额 UPDATE users SET money = $new_money; // 获取影响行数=1,则:{ // 提交事物(解锁我们锁定的记录) COMMIT ; }else{ // 发现不对,撤销我们在事物内做的所有操作 ROLLBACK ; }
不知道會不會導致資料遺失,但有個腦洞,在多線程並發的情況下,很有可能出現後來的資料覆蓋前面的資料.即便是先插入一張表中,在多執行緒中也可能出現後來的先插入的情況吧.
所以建議樓主開啟mysql的事務功能,具體的可以看下這個問題
https://segmentfault.com/q/10...
你這個應用場景很像是:
用一個成語形容這種行為:「慌不擇路」
你有沒有想過,既然你擔心用戶餘額修改時出問題,那麼你也同樣要擔心用戶帳變表插入出問題,那是不是還要另一個表來保證帳變表呢?那另一個表誰來保證呢?
其實,你應該知道正確的解決方法。而不是用兩個不安全的辦法來湊成1個安全的辦法。你這樣做,不但沒有得到1個安全的辦法,反而得到了兩個不安全的辦法。
正確的方法是,直接修改使用者餘額表,並且加上排它鎖。例如:
不知道會不會導致資料遺失,但有個腦洞,在多線程並發的情況下,很有可能出現後來的資料覆蓋前面的資料.即便是先插入一張表中,在多執行緒中也可能出現後來的先插入的情況吧.
所以建議樓主開啟mysql的事務功能,具體的可以看下這個問題
https://segmentfault.com/q/10...