1. 程式人生 > >mysql隔離級別表

mysql隔離級別表

mysql隔離級別

隔離級別臟讀(Dirty Read)不可重復讀(NonRepeatable Read)幻讀(Phantom Read)
未提交讀(Read uncommitted)可能可能可能
已提交讀(Read committed)不可能可能可能
可重復讀(Repeatable read)不可能不可能可能
可串行化(Serializable )不可能不可能不可能
  • 臟讀:一個事務讀取到了另外一個事務沒有提交的數據;
    比如:事務T1更新了一行記錄的內容,但是並沒有提交所做的修改。事務T2讀取到了T1更新後的行,然後T1執行回滾操作,取消了剛才所做的修改。現在T2所讀取的行就無效了;

  • 不可重復讀:在同一事務中,兩次讀取同一數據,得到內容不同;

    比如:事務T1讀取一行記錄,緊接著事務T2修改了T1剛才讀取的那一行記錄。然後T1又再次讀取這行記錄,發現與剛才讀取的結果不同。這就稱為“不可重復”讀,因為T1原來讀取的那行記錄已經發生了變化;

  • 幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同;
    比如:事務T1讀取一條指定的WHERE子句所返回的結果集。然後事務T2新插入 一行記錄,這行記錄恰好可以滿足T1所使用的查詢條件中的WHERE子句的條件。然後T1又使用相同的查詢再次對表進行檢索,但是此時卻看到了事務T2剛才插入的新行。這個新行就稱為“幻像”,因為對T1來說這一行就像突然出現的一樣。

隔離級別越低,事務請求的鎖越少或保持鎖的時間就越短。InnoDB存儲引擎默認的支持隔離級別是REPEATABLE READ;在這種默認的事務隔離級別下已經能完全保證事務的隔離性要求,即達到SQL標準的SERIALIZABLE級別隔離。

我們可以可以用SET TRANSACTION語句改變單個會話或者所有新進連接的隔離級別。它的語法如下:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

註意:默認的行為(不帶session和global)是為下一個(未開始)事務設置隔離級別。如果使用GLOBAL關鍵字,語句在全局對從那點開始創建的所有新連接(除了不存在的連接)設置默認事務級別。你需要SUPER權限來做這個。使用SESSION 關鍵字為將來在當前連接上執行的事務設置默認事務級別。 任何客戶端都能自由改變會話隔離級別(甚至在事務的中間),或者為下一個事務設置隔離級別。

mysql> set session transaction isolation level repeatable read;Query OK, 0 rows affected (0.00 sec)mysql> select @@tx_isolation;+-----------------+| @@tx_isolation  |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.00 sec)


mysql隔離級別表