84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
拥有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...