1. 程式人生 > 實用技巧 >【mysql】- 事務隔離級別和MVCC篇

【mysql】- 事務隔離級別和MVCC篇


概念

術語

  • 髒寫( Dirty Write ): 如果一個事務修改了另一個未提交事務修改過的資料,那就意味著發了髒寫
  • 髒讀( Dirty Read ) : 如果一個事務讀到了另一個未提交事務修改過的資料,那就意味著發了髒讀
  • 不可重複讀(Non-Repeatable Read): 如果一個事務只能讀到另一個已經提交的事務修改過的資料,並且其他事務每對該資料進行一次修改並提交後,該事務都能查詢得到最新值,那就意味著發了不可重複讀
  • 幻讀(Phantom): 如果一個事務先根據某些條件查詢出一些記錄,之後另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來,那就意味著發了幻讀

隔離級別

  • READ UNCOMMITTED :未提交讀。
  • READ COMMITTED :已提交讀。
  • REPEATABLE READ :可重複讀。
  • SERIALIZABLE :可序列化。

對應隔離級別問題

  • READ UNCOMMITTED 隔離級別下,可能發生髒讀不可重複讀幻讀問題
  • READ COMMITTED 隔離級別下,可能發生不可重複讀幻讀問題,但是不可以發生髒讀問題
  • REPEATABLE READ 隔離級別下,可能發生幻讀問題,但是不會發生髒讀不可重複讀的問題
  • SERIALIZABLE 隔離級別下,各種問題都不可以發生。

MySQL的預設隔離級別為REPEATABLE READ

MVCC(多版本併發控制)

  • 在使用READ COMMITTDREPEATABLE READ這兩種隔離級別的事務在執行普通的SEELCT操作時訪問記錄的版本鏈的過程,這樣使可以使不同事務的讀-寫寫-讀操作併發執行,從而提升系統性能
  • READCOMMITTDREPEATABLE READ這兩個隔離級別的一個很大不同就是:生成ReadView的時機不同,READ COMMITTD在每一次進行普通SELECT操作前都會生成一個ReadViewREPEATABLE READ只在第一次進行普通SELECT操作前生成一個ReadView,之後的查詢操作都重複使用這個ReadView就好了