MySQL的隔離級別

2021-08-21 12:23:31 字數 2560 閱讀 7036

平常開發過程中免不了對資料庫的操作,並且還會有多個執行緒同時開啟事務後對資料庫進行訪問,那此時不可避免就會出現多個執行緒之間交叉訪問而導致資料的不一致,通過對資料庫的隔離級別進行設定可以保證各執行緒資料獲取的準確性。

在介紹隔離級別之前先要弄清楚資料庫在併發事務下會出現的一些狀態:

髒讀

髒讀就是乙個事務讀取了另外乙個事務未提交的資料。

事務2讀取了事務1未提交的資料。

不可重複讀

在同一事務中,兩次讀取同一資料,得到內容不同。

例如事務1讀取了某個資料,然後事務2更新了這個資料並提交,然後事務1又來讀取了一次,那這兩次讀取的結果就會不一樣。

幻讀 在乙個事務的兩次查詢中資料記錄數不一致,例如有乙個事務1查詢了幾列資料,而事務2在此時插入了新的幾列資料,事務1在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。

不可重複讀是針對於多次讀取同一條資料出現不同結果,幻讀是多次讀取而產生的記錄數不一樣

為解決上述問題可以給資料庫設定響應的隔離界別,有以下5中隔離級別:

在mysql資料庫中檢視當前事務的隔離級別:

select @@tx_isolation;
在mysql資料庫中設定事務的隔離級別:

set tx_isolation='read-uncommitted';

set tx_isolation='read-committed';

set tx_isolation='repeatable-read';

set tx_isolation='serializable';

下面進行相應的測試,cmd開啟兩個視窗登入mysql,模擬事務1(左)和事務2(右)

將事務1設定隔離級別為read-uncommitted,並且事務1、事務2同時開啟事務,檢視bank表中初始的資料。

在事務2中更新 jack 的錢為 1000 但不提交事務,然後兩邊查詢結果。從圖中可以看到事務1查詢的結果顯示資料已更改,也就是讀取到事務2未提交的資料,這種情況稱之為髒讀。

將事務1設定隔離級別為read-committed,並且事務1、事務2同時開啟事務,檢視bank表中初始的資料。

在事務2中更新 jack 的錢為 200 但不提交事務,然後兩邊查詢結果。通過設定為read-commited,事務1 將不會讀取到事務2未提交的資料,避免了髒讀。

在上一步中,事務2更新完後提交資料,然後事務1 事務2再次查詢。在事務2提交事務後,事務1(事務1沒有提交)前後兩次的查詢結果不一致了,這裡就產生了不可重複的狀態(參考上面的定義及示意圖)

將事務1設定為repeatable-read,並且事務1、事務2同時開啟事務,檢視bank表中初始的資料。

在事務2中更新 jack 的錢為 500 提交事務,然後兩邊查詢結果,事務1(事務1不提交事務)中的資料並未受事務2更新的影響,避免了不可重複讀的情況。

4、serializable

將事務1設定隔離級別為serializable,並且事務1、事務2同時開啟事務。

然後在事務1中執行乙個查詢語句但不提交事務,接著在事務2中執行一條更新語句,會發現事務2中輸入sql語句按下回車鍵後sql語句並未執行,處於等待狀態。

只有當事務1提交事務後事務2的sql語句才會執行,這就是事務的序列化,多個事務排隊按照先後順序依次執行。

以上就是對資料庫的隔離級別簡單的介紹,有問題歡迎指出~

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

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

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

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

Mysql隔離級別

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