MySQL 事務中的不可重複讀和幻讀問題

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的數據。it

相關文章
相關標籤/搜索