mysql優化 - mysql數據insert快還是update比較快
問題描述
問題解答
回答1:你這個應用場景很像是:
修改用戶余額前,因為怕修改出問題,意外把用戶余額改為0什么的。而選擇先插入一條記錄到用戶賬務變動表,然后查出賬務變動表的數據,來更新用戶余額字段。
用一個成語形容這種行為:“慌不擇路”
你有沒有想過,既然你擔心用戶余額修改時出問題,那么你也同樣要擔心用戶帳變表插入出問題,那是不是還要另一個表來保證帳變表呢?那另一個表誰來保證呢?
其實,你應該知道正確的解決辦法。而不是用兩個不安全的辦法來湊成1個安全的辦法。你這樣做,非但沒有得到1個安全的辦法,反而得到了兩個不安全的辦法。
正確的辦法是,直接修改用戶余額表,并且加上排它鎖。例如:
// 開始事物BEGIN ;// 取出該用戶數據,并鎖住,防止其他線程(進程)讀取該條記錄SELECT * FROM users where id = $id FOR UPDATE ;// 處理業務...計算用戶新的余額// 更新用戶余額UPDATE users SET money = $new_money;// 獲取影響行數=1,則:{ // 提交事物(解鎖我們鎖定的記錄) COMMIT ;}else{ // 發現不對,撤銷我們在事物內做的所有操作 ROLLBACK ;}回答2:
不知道會不會導致數據丟失,但有個腦洞,在多線程并發的情況下,很有可能出現后來的數據覆蓋前面的數據.即便是先插入一張表中,在多線程中也可能出現后來的先插入的情況吧.
所以建議樓主開啟mysql的事務功能,具體的可以看下這個問題
https://segmentfault.com/q/10...
相關文章:
1. linux - 編譯時提示頭文件#include <mysql/mysql.h>不存在,百度之后也沒解決2. node.js - nodejs 如何在centos下后臺運行,nohup和forever都不行呀3. javascript - 關于webpack的問題,很簡單4. excel - 要如何在號碼前面加0 ? JAVA5. html5 - 有什么好的方法防止微信公眾號發紅包被刷么?6. java - linux安裝idea出錯JDK Required: ’tools.jar’ seems to be not in IDEA7. css - 移動端字體設置問題8. javascript - 前端需要在頁面中展示PPT,請問有沒有什么好的方法?9. javascript - 微信返回按鈕能監聽到嗎?后退了就刷新這個頁面能嗎10. html5 - H5做的手機分享頁微信更新后,分享出去不再默認顯示第一個圖 作為縮略圖
