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. php - mysql 模糊搜索問題2. 請問連接文件怎么寫3. 求救一下,用新版的phpstudy,數據庫過段時間會消失是什么情況?4. php - 微信開發驗證服務器有效性5. python沒入門,請教一個問題6. 小程序怎么加外鏈,語句怎么寫!求救新手,開文檔沒發現7. [python2]local variable referenced before assignment問題8. javascript - 我的站點貌似被別人克隆了, google 搜索特定文章,除了域名不一樣,其他的都一樣,如何解決?9. javascript - js setTimeout在雙重for循環中如何使用?10. javascript - 求幫助 , ATOM不顯示界面!!!!
