如何理解 MySQL 事務(wù)中的不可重復(fù)讀和幻讀問(wèn)題?
問(wèn)題描述
如何理解 MySQL 事務(wù)中的不可重復(fù)讀和幻讀問(wèn)題? 或者說(shuō) READ COMMIT 和 REPEAT COMMIT 兩種隔離性的區(qū)別在哪?
問(wèn)題解答
回答1:剛好學(xué)習(xí)一下這個(gè),我就粗淺的來(lái)說(shuō)說(shuō)我的想法:Read Committed(不可重復(fù)讀):假設(shè)事務(wù)1讀取了一條記錄(select user_name from user where user_id = 1),得到user_name = ’456’,事務(wù)1暫時(shí)沒(méi)提交。事務(wù)2更新了一條記錄(update user set user_name = ’123’ where user_id = 1),事務(wù)2提交。此時(shí)事務(wù)1再次select user_name from user where user_id = 1得到了user_name = ’123’,這樣就導(dǎo)致事務(wù)1在讀取同一行數(shù)據(jù)卻得到不同的user_name。這就是所謂的不可以重復(fù)讀
Repeatable Read(可重復(fù)讀,會(huì)產(chǎn)生幻讀):這個(gè)跟不可重復(fù)讀相反,當(dāng)事務(wù)1查詢(xún)到user_name=’456’時(shí),事務(wù)2將user_name更新成’123’并提交,事務(wù)1再次查詢(xún)還是會(huì)發(fā)現(xiàn)user_name=’456’,這樣保證了可重復(fù)讀。幻讀的話(huà)就是當(dāng)事務(wù)2插入一條新的數(shù)據(jù)id為2并提交,事務(wù)1由于可重復(fù)讀的性質(zhì),只能在表中查到id為1的數(shù)據(jù),如果此時(shí)事務(wù)1插入id為2的數(shù)據(jù)則會(huì)產(chǎn)生錯(cuò)誤,因?yàn)榇藭r(shí)表中已經(jīng)有了id為2的數(shù)據(jù),但是事務(wù)1只看到了id為1的數(shù)據(jù)。
相關(guān)文章:
1. 如何解決Centos下Docker服務(wù)啟動(dòng)無(wú)響應(yīng),且輸入docker命令無(wú)響應(yīng)?2. 我在centos容器里安裝docker,也就是在容器里安裝容器,報(bào)錯(cuò)了?3. vue ajax請(qǐng)求回來(lái)的數(shù)據(jù)沒(méi)有渲染到頁(yè)面4. mysql新建字段時(shí) timestamp NOT NULL DEFAULT ’0000-00-00 00:00:00’ 報(bào)錯(cuò)5. docker 17.03 怎么配置 registry mirror ?6. javascript - js 關(guān)于時(shí)間的轉(zhuǎn)換以及時(shí)間的加減。7. objective-c - IOS 分享到微信 提示 應(yīng)用消息數(shù)據(jù)錯(cuò)誤8. javascript - 音樂(lè)播放器-圖片旋轉(zhuǎn)9. angular.js - 用angularjs的service封裝百度地圖api出錯(cuò),請(qǐng)問(wèn)原因?10. MySQL timestamp的默認(rèn)值怎么設(shè)置?
