mysql優(yōu)化 - mysql數(shù)據(jù)insert快還是update比較快
問(wèn)題描述
問(wèn)題解答
回答1:你這個(gè)應(yīng)用場(chǎng)景很像是:
修改用戶余額前,因?yàn)榕滦薷某鰡?wèn)題,意外把用戶余額改為0什么的。而選擇先插入一條記錄到用戶賬務(wù)變動(dòng)表,然后查出賬務(wù)變動(dòng)表的數(shù)據(jù),來(lái)更新用戶余額字段。
用一個(gè)成語(yǔ)形容這種行為:“慌不擇路”
你有沒(méi)有想過(guò),既然你擔(dān)心用戶余額修改時(shí)出問(wèn)題,那么你也同樣要擔(dān)心用戶帳變表插入出問(wèn)題,那是不是還要另一個(gè)表來(lái)保證帳變表呢?那另一個(gè)表誰(shuí)來(lái)保證呢?
其實(shí),你應(yīng)該知道正確的解決辦法。而不是用兩個(gè)不安全的辦法來(lái)湊成1個(gè)安全的辦法。你這樣做,非但沒(méi)有得到1個(gè)安全的辦法,反而得到了兩個(gè)不安全的辦法。
正確的辦法是,直接修改用戶余額表,并且加上排它鎖。例如:
// 開(kāi)始事物BEGIN ;// 取出該用戶數(shù)據(jù),并鎖住,防止其他線程(進(jìn)程)讀取該條記錄SELECT * FROM users where id = $id FOR UPDATE ;// 處理業(yè)務(wù)...計(jì)算用戶新的余額// 更新用戶余額UPDATE users SET money = $new_money;// 獲取影響行數(shù)=1,則:{ // 提交事物(解鎖我們鎖定的記錄) COMMIT ;}else{ // 發(fā)現(xiàn)不對(duì),撤銷我們?cè)谑挛飪?nèi)做的所有操作 ROLLBACK ;}回答2:
不知道會(huì)不會(huì)導(dǎo)致數(shù)據(jù)丟失,但有個(gè)腦洞,在多線程并發(fā)的情況下,很有可能出現(xiàn)后來(lái)的數(shù)據(jù)覆蓋前面的數(shù)據(jù).即便是先插入一張表中,在多線程中也可能出現(xiàn)后來(lái)的先插入的情況吧.
所以建議樓主開(kāi)啟mysql的事務(wù)功能,具體的可以看下這個(gè)問(wèn)題
https://segmentfault.com/q/10...
相關(guān)文章:
1. macos - 無(wú)法source activate python272. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?3. javascript - 微信 H5 授權(quán) 返回鍵4. github - 求助大神啊,win10 git clone error,折騰了幾天都不行,以前原本好好的,突然就這樣了5. android - 如何實(shí)現(xiàn)QQ pad 點(diǎn)擊右側(cè)輸入框,只頂右側(cè)的布局,左側(cè)布局不動(dòng)6. javascript - npm run build后調(diào)用api返回index.html7. css - 關(guān)于background-position百分比的問(wèn)題?8. html - vue里面:src在IE(9-11)下不顯示圖片9. javascript - node得到req不能得到boolean10. 小白學(xué)python的問(wèn)題 關(guān)于%d和%s的區(qū)別

網(wǎng)公網(wǎng)安備