mysql優(yōu)化 - mysql數(shù)據(jù)insert快還是update比較快
問題描述
問題解答
回答1:你這個應(yīng)用場景很像是:
修改用戶余額前,因為怕修改出問題,意外把用戶余額改為0什么的。而選擇先插入一條記錄到用戶賬務(wù)變動表,然后查出賬務(wù)變動表的數(shù)據(jù),來更新用戶余額字段。
用一個成語形容這種行為:“慌不擇路”
你有沒有想過,既然你擔(dān)心用戶余額修改時出問題,那么你也同樣要擔(dān)心用戶帳變表插入出問題,那是不是還要另一個表來保證帳變表呢?那另一個表誰來保證呢?
其實,你應(yīng)該知道正確的解決辦法。而不是用兩個不安全的辦法來湊成1個安全的辦法。你這樣做,非但沒有得到1個安全的辦法,反而得到了兩個不安全的辦法。
正確的辦法是,直接修改用戶余額表,并且加上排它鎖。例如:
// 開始事物BEGIN ;// 取出該用戶數(shù)據(jù),并鎖住,防止其他線程(進程)讀取該條記錄SELECT * FROM users where id = $id FOR UPDATE ;// 處理業(yè)務(wù)...計算用戶新的余額// 更新用戶余額UPDATE users SET money = $new_money;// 獲取影響行數(shù)=1,則:{ // 提交事物(解鎖我們鎖定的記錄) COMMIT ;}else{ // 發(fā)現(xiàn)不對,撤銷我們在事物內(nèi)做的所有操作 ROLLBACK ;}回答2:
不知道會不會導(dǎo)致數(shù)據(jù)丟失,但有個腦洞,在多線程并發(fā)的情況下,很有可能出現(xiàn)后來的數(shù)據(jù)覆蓋前面的數(shù)據(jù).即便是先插入一張表中,在多線程中也可能出現(xiàn)后來的先插入的情況吧.
所以建議樓主開啟mysql的事務(wù)功能,具體的可以看下這個問題
https://segmentfault.com/q/10...
相關(guān)文章:
1. javascript - 微信報redirect_uri參數(shù)錯誤2. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?3. android - 類似微信朋友圈或者QQ空間說說那種點擊圖片放大,并且有放大縮小手勢,左右滑動圖片手勢效果4. java - Atom中文問題5. angular.js - ng-model如何綁定二選一的單選項框?6. java - 初學(xué)SSM 在import自己寫的包下的類的時候飄紅,求大神解答?7. 網(wǎng)頁動畫等過渡效果,CSS3 transitions 和 jQuery animations 誰實現(xiàn)的性能更好?8. 怎么在HTML5中播放VR視頻9. javascript - 如何計算字符串寬度?10. win10系統(tǒng) php安裝swoole擴展
