首頁  >  問答  >  主體

mysql优化 - mysql数据insert快还是update比较快

高洛峰高洛峰2743 天前762

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 16:29:11

    你這個應用場景很像是:

    修改用戶餘額前,因為怕修改出問題,意外把用戶餘額改為0什麼的。
    而選擇先插入一筆記錄到使用者帳務變動表,然後查出帳務變更表的數據,來更新使用者餘額欄位。


    用一個成語形容這種行為:「慌不擇路」

    你有沒有想過,既然你擔心用戶餘額修改時出問題,那麼你也同樣要擔心用戶帳變表插入出問題,那是不是還要另一個表來保證帳變表呢?那另一個表誰來保證呢?

    其實,你應該知道正確的解決方法。而不是用兩個不安全的辦法來湊成1個安全的辦法。你這樣做,不但沒有得到1個安全的辦法,反而得到了兩個不安全的辦法。

    正確的方法是,直接修改使用者餘額表,並且加上排它鎖。例如:

    // 开始事物
    BEGIN ;
    
    // 取出该用户数据,并锁住,防止其他线程(进程)读取该条记录
    SELECT * FROM users where id = $id FOR UPDATE ;
    
    // 处理业务...计算用户新的余额
    
    // 更新用户余额
    UPDATE users SET money = $new_money;
    
    // 获取影响行数=1,则:{
      // 提交事物(解锁我们锁定的记录)
      COMMIT ;
    }else{
      // 发现不对,撤销我们在事物内做的所有操作
      ROLLBACK ;
    }
    

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 16:29:11

    不知道會不會導致資料遺失,但有個腦洞,在多線程並發的情況下,很有可能出現後來的資料覆蓋前面的資料.即便是先插入一張表中,在多執行緒中也可能出現後來的先插入的情況吧.

    所以建議樓主開啟mysql的事務功能,具體的可以看下這個問題

    https://segmentfault.com/q/10...

    回覆
    0
  • 取消回覆