如何理解 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’,這樣保證了可重復讀?;米x的話就是當事務2插入一條新的數據id為2并提交,事務1由于可重復讀的性質,只能在表中查到id為1的數據,如果此時事務1插入id為2的數據則會產生錯誤,因為此時表中已經有了id為2的數據,但是事務1只看到了id為1的數據。
相關文章:
1. javascript - 關于apply()與call()的問題2. 安全性測試 - nodejs中如何防mySQL注入3. java - spring boot 如何打包成asp.net core 那種獨立應用?4. java - 在用戶不登錄的情況下,用戶如何添加保存到購物車?5. javascript - nginx反向代理靜態資源403錯誤?6. docker網絡端口映射,沒有方便點的操作方法么?7. docker - 各位電腦上有多少個容器???容器一多,自己都搞混了,咋辦呢?8. MySQL 查詢疑問?9. 推薦好用mysql管理工具?for mac和pc10. javascript - 如何將函數計算出的內容傳遞為變量
