READ UNCOMMITTED(未提交)
即便沒有提交,對其它事務也可見。未提交的數據會引發髒讀(Dirty Read)。
測試流程:
一、A設置read-uncommitted, start transaction
二、B執行start transaction,修改一條記錄,
三、A查詢記錄,獲得了覺得正確的記錄
四、B回滾。
問題:A讀到了B沒有提交的記錄,也就是髒讀。
READ COMMITTED(提交讀)
一個從開始直到提交以前所作的任何修改對其它事務都是不可見的。兩次一樣的查詢可能會獲得不同的結果,稱爲不可重複讀(nonrepeatable read)
測試流程:
一、A設置read-committed, start transaction
二、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改爲功
三、A查詢記錄,結果仍是老的記錄
四、B提交事務
五、A再次查詢記錄,結果是新的記錄。
問題:兩次查詢結果不一致,也就是不可重複讀問題。
REPEATABLE READ(可重複讀)-MySQL默認的事務隔離級別
保證了在同一事務中屢次讀取結果是一致的。但會引發另一個幻讀問題,當某個事務在讀取某個範圍記錄時,另一個事務在該範圍插入和新記錄,當以前事務再次讀取該範圍記錄時會產生幻行。
測試流程:
一、A設置repeatable-read, start transaction,查詢記錄,結果是老的記錄
二、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改爲功
三、A查詢記錄,結果仍是老的記錄
四、B提交事務
五、A再次查詢記錄,結果仍是老的記錄。
問題:能夠重複讀,A在事務過程當中,即便B修改了數據,而且commit,A讀取的仍是老的數據。即可重複讀。
注意:這裏可能會存在一個新的問題,A在事務過程當中,B增長一條記錄,並提交,致使A的兩次讀取不一致,會多一條記錄,也就是幻影讀。InnoDB經過多版本併發控制(MVCC)解決了幻讀問題。
SERIALIZABLE(可串行化)
強制事務串行執行,但可能致使大量超時和鎖爭問題。
測試流程:
一、A設置serializable, start transaction,查詢記錄,結果是老的記錄
二、B執行start transaction,修改一條記錄,B卡在這裏,要等待A完成才行。
三、A查詢記錄,結果仍是老的記錄,A提交。
四、B的修改操做才進行下去。
注意:B在等待過程當中,會出現lock超時。php
發佈時間: 2015-06-10 瀏覽次數:1425 分類: 數據庫html
READ UNCOMMITTED(未提交)
即便沒有提交,對其它事務也可見。未提交的數據會引發髒讀(Dirty Read)。
測試流程:
一、A設置read-uncommitted, start transaction
二、B執行start transaction,修改一條記錄,
三、A查詢記錄,獲得了覺得正確的記錄
四、B回滾。
問題:A讀到了B沒有提交的記錄,也就是髒讀。
READ COMMITTED(提交讀)
一個從開始直到提交以前所作的任何修改對其它事務都是不可見的。兩次一樣的查詢可能會獲得不同的結果,稱爲不可重複讀(nonrepeatable read)
測試流程:
一、A設置read-committed, start transaction
二、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改爲功
三、A查詢記錄,結果仍是老的記錄
四、B提交事務
五、A再次查詢記錄,結果是新的記錄。
問題:兩次查詢結果不一致,也就是不可重複讀問題。
REPEATABLE READ(可重複讀)-MySQL默認的事務隔離級別
保證了在同一事務中屢次讀取結果是一致的。但會引發另一個幻讀問題,當某個事務在讀取某個範圍記錄時,另一個事務在該範圍插入和新記錄,當以前事務再次讀取該範圍記錄時會產生幻行。
測試流程:
一、A設置repeatable-read, start transaction,查詢記錄,結果是老的記錄
二、B執行start transaction,修改一條記錄,查詢記錄,記錄已經修改爲功
三、A查詢記錄,結果仍是老的記錄
四、B提交事務
五、A再次查詢記錄,結果仍是老的記錄。
問題:能夠重複讀,A在事務過程當中,即便B修改了數據,而且commit,A讀取的仍是老的數據。即可重複讀。
注意:這裏可能會存在一個新的問題,A在事務過程當中,B增長一條記錄,並提交,致使A的兩次讀取不一致,會多一條記錄,也就是幻影讀。InnoDB經過多版本併發控制(MVCC)解決了幻讀問題。
SERIALIZABLE(可串行化)
強制事務串行執行,但可能致使大量超時和鎖爭問題。
測試流程:
一、A設置serializable, start transaction,查詢記錄,結果是老的記錄
二、B執行start transaction,修改一條記錄,B卡在這裏,要等待A完成才行。
三、A查詢記錄,結果仍是老的記錄,A提交。
四、B的修改操做才進行下去。
注意:B在等待過程當中,會出現lock超時。
MySQL事務隔離級別總結:
mysql
MySQL事務隔離級別操做
查看當前會話隔離級別:sql
mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.12 sec)
查看當前系統隔離級別:數據庫
mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | REPEATABLE-READ | +-----------------------+
設置隔離級別語法:併發
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}