mysql优化 - mysql数据insert快还是update比较快
高洛峰
高洛峰 2017-04-17 16:27:11
0
2
751
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
小葫芦

你這個應用場景很像是:

修改用戶餘額前,因為怕修改出問題,意外把用戶餘額改為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...

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!