1. 程式人生 > 其它 >Mybatis JDBC 事務隔離級別/髒讀 不可重複讀 幻讀(虛讀)

Mybatis JDBC 事務隔離級別/髒讀 不可重複讀 幻讀(虛讀)

技術標籤:JavaMybatisMybatisJDBC事物隔離級別

一般資料庫的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。


√: 可能出現×: 不會出現

髒讀不可重複讀幻讀(虛讀)

說明

Read uncommitted

直譯就是"讀未提交",意思就是即使一個更新語句沒有提交,但是別
的事務可以讀到這個改變.這是很不安全的。允許任務讀取資料庫中未提交的資料更改,也稱為髒讀。

Read committed×

直譯就是"讀提交",可防止髒讀,意思就是語句提交以後即執行了COMMIT以後
別的事務就能讀到這個改變. 只能讀取到已經提交的資料。Oracle等多數資料庫預設都是該級別

Repeatable read××

直譯就是"可以重複讀",這是說在同一個事務裡面先後執行同一個查詢語句的時候,得到的結果是一樣的.在同一個事務內的查詢都是事務開始時刻一致的,InnoDB預設級別。在SQL標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀

Serializable×××

直譯就是"序列化",意思是說這個事務執行的時候不允許別的事務併發執行. 完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞

Mybatis也是提供瞭如上表所示的隔離級別,只不過增加了一種不支援事務,原始碼如下:

/**
 * @author Clinton Begin
 */
public enum TransactionIsolationLevel {
  NONE(Connection.TRANSACTION_NONE),
  READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),
  READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),
  REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),
  SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);
 
  private final int level;
 
  private TransactionIsolationLevel(int level) {
    this.level = level;
  }
 
  public int getLevel() {
    return level;
  }
}

https://blog.csdn.net/qq924862077/article/details/52599961

補充:資料庫隔離級別:

先對不同隔離級別涉及到的名詞解釋:
• 髒讀: 對於兩個事物 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的欄位. 之後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
• 不可重複讀: 對於兩個事物 T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.
• 幻讀: 對於兩個事物 T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾

具體的隔離級別定義:

READ UNCOMMITTED(讀未提交資料) 允許事務讀取未被其他事務提交的變更,髒讀、不可重複讀和幻讀的問題都會出現

READ COMMITED(讀已提交資料) 只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不可重複讀和幻讀問題仍然會出現

REPEATABLE READ(可重複讀) 確保事務可以多次從一個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個欄位進行更新,可以避免髒讀和不可重複讀,但幻讀的問題依然存在

SERIALIZABLE(序列化) 確保事務可以從一個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入、更新和刪除操作,所有併發問題都可以避免,但效能十分低

Oracle 支援的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE. Oracle 預設的事務隔離級別為: READ COMMITED
Mysql 支援 4 中事務隔離級別. Mysql 預設的事務隔離級別為: REPEATABLE READ

https://www.kancloud.cn/digest/andyalien-mybatis/190197