1. 程式人生 > >MySQL InnoDB儲存引擎隔離級別及髒讀、不重複讀、幻讀

MySQL InnoDB儲存引擎隔離級別及髒讀、不重複讀、幻讀

前記:

  1. ORACLE不支援Read Uncommitted和Repeatable Read事務隔離級別;
  2. InnoDB預設是RR,使用Next-Key Lock演算法避免幻讀,達到Serializable隔離級別;
  3. 隔離級別越低,事務請求所越少或保持鎖的時間越短;

一、隔離級別查詢和修改


    #查詢全域性事務隔離級別
    select @@global.tx_isolation;
    #查詢當前回話事務隔離級別
    select @@session.tx_isolation;
    #配置檔案my.cnf
    transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE}
    #修改單個回話或新鏈路
   SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}


二、事務隔離級別,預設為可重複讀(Repeatable Read)

  • 未提交讀(Read Uncommitted):A事務修改資料,不commit,B事務中select可讀到未commit的資料(髒讀,隔離級別最低,併發效能高);
  • 已提交讀(Read Committed):事務select讀取的是最新資料(其他事務commit後的,會導致前後兩次相同的select讀到不同結果);
  • 可重複讀(Repeatable Read):A事務中,select讀取結果是事務開始時的狀態,因此讀取結果一致,但會出現幻讀;
  • 序列化(Serializable):讀操作會隱式獲取共享鎖,保證不同事務間的互斥;

三、問題

  • 髒讀:A事務修改了資料,未提交,B事務中select讀到未被commit的資料;
  • 不重複讀:A事務執行過程中,B事務提交了新資料,則A事務前後兩次select資料結果不一致;
  • 幻讀:A事務執行過程中,B事務同時提交了新資料,A事務更新(insert/update)時,會發現新資料;

四、隔離級別VS問題

隔離級別 髒讀 不重複讀 幻讀
為提交讀(RU) 可能 可能 可能
已提交讀(RC) 不可能 可能 可能
可重複讀(RR) 不可能 不可能 可能
序列化(Ser) 不可能 不可能 不可能

注:如有錯誤,請指正!