如何理解 MySQL 事務中的不可重復讀和幻讀問題?
問題描述
如何理解 MySQL 事務中的不可重復讀和幻讀問題? 或者說 READ COMMIT 和 REPEAT COMMIT 兩種隔離性的區(qū)別在哪?
問題解答
回答1:剛好學習一下這個,我就粗淺的來說說我的想法:Read Committed(不可重復讀):假設事務1讀取了一條記錄(select user_name from user where user_id = 1),得到user_name = ’456’,事務1暫時沒提交。事務2更新了一條記錄(update user set user_name = ’123’ where user_id = 1),事務2提交。此時事務1再次select user_name from user where user_id = 1得到了user_name = ’123’,這樣就導致事務1在讀取同一行數(shù)據(jù)卻得到不同的user_name。這就是所謂的不可以重復讀
Repeatable Read(可重復讀,會產(chǎn)生幻讀):這個跟不可重復讀相反,當事務1查詢到user_name=’456’時,事務2將user_name更新成’123’并提交,事務1再次查詢還是會發(fā)現(xiàn)user_name=’456’,這樣保證了可重復讀。幻讀的話就是當事務2插入一條新的數(shù)據(jù)id為2并提交,事務1由于可重復讀的性質,只能在表中查到id為1的數(shù)據(jù),如果此時事務1插入id為2的數(shù)據(jù)則會產(chǎn)生錯誤,因為此時表中已經(jīng)有了id為2的數(shù)據(jù),但是事務1只看到了id為1的數(shù)據(jù)。
相關文章:
1. javascript - nodejs實現(xiàn)異步時遇到的一個問題2. css3 - Typecho 后臺部分表單按鈕在 Chrome 下出現(xiàn)靈異動畫問題,求解決3. mysql - 面試題:如何把login_log表轉換成last_login表?4. java - 阿里的開發(fā)手冊中為什么禁用map來作為查詢的接受類?5. apache - 想把之前寫的單機版 windows 軟件改成網(wǎng)絡版,讓每個用戶可以注冊并登錄。類似 qq 的登陸,怎么架設服務器呢?6. javascript - 為什么嵌套的Promise不能按預期捕獲Exception?7. java - 關于i++的一個題目8. javascript - 編程,算法的問題9. java - HTTPS雙向認證基礎上有無必要再進行加簽驗簽?10. myeclipse中修改了javaweb的web.xml文件,為什么有時候會自動重新部署生效,有時就不會自動呢?
