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. centos - apache配置django報錯:cannot be loaded as Python modules2. html5 - 使用angular中,圖片上傳功能中選擇多張圖片是怎么實現的?有什么好的思路嗎?3. python - flask jinjia2 中怎么定義嵌套變量4. python - Django問題 ’WSGIRequest’ object has no attribute ’user’5. 數據庫 - mysql boolean型無法插入true6. javascript - jquery選擇的dom元素如何更新?7. javascript - H5頁面無縫輪播8. .......9. javascript - URL中有#號如何來獲取參數啊? nodejs10. MYSQL 的 SELECT 語句中如何做到判斷字段為空
