如何理解 MySQL 事務中的不可重復讀和幻讀問題?
問題描述
如何理解 MySQL 事務中的不可重復讀和幻讀問題? 或者說 READ COMMIT 和 REPEAT COMMIT 兩種隔離性的區別在哪?
問題解答
回答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在讀取同一行數據卻得到不同的user_name。這就是所謂的不可以重復讀
Repeatable Read(可重復讀,會產生幻讀):這個跟不可重復讀相反,當事務1查詢到user_name=’456’時,事務2將user_name更新成’123’并提交,事務1再次查詢還是會發現user_name=’456’,這樣保證了可重復讀。幻讀的話就是當事務2插入一條新的數據id為2并提交,事務1由于可重復讀的性質,只能在表中查到id為1的數據,如果此時事務1插入id為2的數據則會產生錯誤,因為此時表中已經有了id為2的數據,但是事務1只看到了id為1的數據。
相關文章:
1. android - rxjava merge 返回Object對象數據如何緩存2. mysql 一個sql 返回多個總數3. java - 三位二進制表示8進制,四位二進制表示16進制,那么多少二進制表示10進制呢?4. 如何用筆記本上的apache做微信開發的服務器5. CSS3 畫如下圖形6. angular.js - ionic2 瀏覽器跨域問題7. javascript - 螞蟻金服里的react Modal方法,是怎么把元素插入到頁面最后的8. python - Scrapy存在內存泄漏的問題。9. 【python|scapy】sprintf輸出時raw_string轉string10. docker 下面創建的IMAGE 他們的 ID 一樣?這個是怎么回事????
