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. 測試自動化html元素選擇器元素ID或DataAttribute [關閉]2. 在mac下出現了兩個docker環境3. 利用IPMI遠程安裝centos報錯!4. 運行python程序時出現“應用程序發生異常”的內存錯誤?5. spring-mvc - spring-session-redis HttpSessionListener失效6. java - Spring boot 讀取 放在 jar 包外的,log4j 配置文件,系統有創建日志文件,不寫入日志信息。7. 淺談Vue使用Cascader級聯選擇器數據回顯中的坑8. javascript - 在 model里定義的 引用表模型時,model為undefined。9. javascript - 最近用echarts做統計圖時遇到兩個問題!!10. mysql - 查詢 修改數據庫優化問題吧

網公網安備