mysql隔離級別 MySQL 事務隔離級別

2021-10-18 08:14:41 字數 2419 閱讀 1541

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性(undo log)、一致性(undo log)、永續性(redo log),事務通過鎖機制實現隔離性。
1、事務隔離級別與實現read-uncommitted:"讀未提交"

read-committed:"讀已提交" 或者 "讀提交"

實現機制:修改時加排他鎖,直到事務提交後才釋放,讀取時加共享鎖,讀取完釋放。

repeatable-read: "可重複讀" 或者 "可重讀"。mysql預設使用級別。

實現機制:讀取資料時加共享鎖,寫資料時加排他鎖,都是事務提交才釋放鎖。採用"一致性非鎖定讀"的機制提高了資料庫併發性(非鎖定讀),使用mvcc(多版本併發控制)實現。

serializable: "序列化"。

實現機制:所有的讀操作均為當前讀,讀加讀鎖 (s鎖),寫加寫鎖 (x鎖)。採用的是ranges_s模式,鎖定檢索範圍為唯讀,這樣就避免了幻影讀問題,表級鎖

show processlist ;#檢視連線線程

show variables like 'tx_isolation'; #檢視隔離級別

mysql> set @@session.tx_isolation='read-uncommitted'; #設定當前執行緒隔離級別,global全域性

query ok, 0 rows affected, 1 warning (0.00 sec)

啟動兩個不同執行緒的客戶端:

設定事務隔離級別並檢視:

讀未提交:

讀已提交:

可重複讀:

注意:※ 可重複讀僅在事務開始時建立一次快照,而讀提交每次執行語句都會重新建立一次快照。

可重複讀-幻讀:

可重複讀-併發寫阻塞(索引列使用行鎖):

可重複讀-併發寫阻塞(非索引列使用表鎖):

可重複讀-間隙鎖:

next-key鎖:

注意:※ age為索引,當操作age=28時,不僅針對該記錄加行鎖,且兩側加間隙鎖,33<=age不受影響;

age不為索引時,對整表加間隙鎖;

※ 併發寫問題利用行鎖解決,解決幻讀用間隙鎖,mysql 把行鎖和間隙鎖合併「next-key鎖」使用,解決併發寫和幻讀。

2、髒讀、幻讀、不可重複

髒讀:當前事務可以檢視到別的事務未提交的資料(側重點在於別的事務未提交)。

幻讀:幻讀的側重點在於新增和刪除(資料量的變化)。表示在同一事務中,使用相同的查詢語句,第二次查詢時,莫名的多出了一些之前不存在資料,或者莫名的不見了一些資料(mysql 的可重複讀隔離級別通過間隙鎖解決了幻讀問題,但插入相同主鍵會衝突)。

不可重讀:不可重讀的側重點在於更新修改資料(資料內容的更新)。同一事務中,查詢相同的資料範圍時,同乙個資料資源莫名的改變了。

3、隔離界別區別

事務的隔離級別越高,隔離性越強,資料問題越少,併發能力越弱。

mysql隔離級別驗證 mysql 隔離級別測試

1 設定隔離級別,包括 全域性 global.tx isolation,會話級別 session.tx isolation mysql workbench的會話 2 建立測試表 注意 unsigned auto increment primary key用法 預設引擎的設定 建立測試表 use te...

Mysql隔離級別

先記錄下幾個概念 髒讀 在當前事務中,讀取到其他事務中還未提交的資料 不可重複讀 在當前事務中,讀取某一行的資料,可能讀出的資料不同 幻讀 在當前事務中,讀取記錄時,另外的事務插入了新的記錄,當前事務可能出現新的行。四種隔離級別 1.未提交讀 可能讀到髒資料 會話a中的隔離級別為未提交讀 表中原來的...

Mysql 隔離級別

此隔離級別中,事務的修改對其他的事務也是可見的,事務可以讀取未提交的資料,也稱為髒讀 dirty read 很少使用此級別。大多數資料庫系統預設使用該隔離級別 mysql不是 此隔離級別中事務從開始到提交資料之前,所有的操作對於其他事物都是不見的,也稱作不可重複讀 nonrepeatable 造成2...