如何理解 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查詢到user_name=’456’時(shí),事務(wù)2將user_name更新成’123’并提交,事務(wù)1再次查詢還是會(huì)發(fā)現(xiàn)user_name=’456’,這樣保證了可重復(fù)讀。幻讀的話就是當(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. python - linux怎么在每天的凌晨2點(diǎn)執(zhí)行一次這個(gè)log.py文件2. 關(guān)于mysql聯(lián)合查詢一對(duì)多的顯示結(jié)果問(wèn)題3. 實(shí)現(xiàn)bing搜索工具urlAPI提交4. MySQL主鍵沖突時(shí)的更新操作和替換操作在功能上有什么差別(如圖)5. 數(shù)據(jù)庫(kù) - Mysql的存儲(chǔ)過(guò)程真的是個(gè)坑!求助下面的存儲(chǔ)過(guò)程哪里錯(cuò)啦,實(shí)在是找不到哪里的問(wèn)題了。6. windows誤人子弟啊7. 冒昧問(wèn)一下,我這php代碼哪里出錯(cuò)了???8. 如何用筆記本上的apache做微信開(kāi)發(fā)的服務(wù)器9. 我在網(wǎng)址中輸入localhost/abc.php顯示的是not found是為什么呢?10. mysql優(yōu)化 - MySQL如何為配置表建立索引?
