MySQL InnoDB儲存引擎隔離級別及髒讀、不重複讀、幻讀
阿新 • • 發佈:2019-02-10
前記:
- ORACLE不支援Read Uncommitted和Repeatable Read事務隔離級別;
- InnoDB預設是RR,使用Next-Key Lock演算法避免幻讀,達到Serializable隔離級別;
- 隔離級別越低,事務請求所越少或保持鎖的時間越短;
一、隔離級別查詢和修改
#查詢全域性事務隔離級別
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) | 不可能 | 不可能 | 不可能 |
注:如有錯誤,請指正!