事務的隔離狀況

2021-10-04 22:32:45 字數 1103 閱讀 1680

可重複讀:查詢只承認在事務啟動之前已經提交的資料

讀提交:查詢只承認在語句啟動前已經提交的資料

當前讀:總是讀取已經提交完成的最新版本

在mysql中有兩個檢視的概念:

1、乙個是view,乙個用查詢語句定義的虛擬表,在呼叫的時候執行查詢語句並返回結果

2、另外是innodb為了實現mvcc時用到的一致性檢視,用於支援rc-讀提交、rr-可重複讀隔離級別的實現

可重複讀隔離級別,事務在啟動的時候基於整個庫「拍」了個快照;實際上他的快照操作並不是對資料的複製,不然就不會快速的啟動乙個事務,實際上是基於事務的id來實現的

檢視陣列把所有row trx_id分為:已提交事務、未提交事務集合(當前事務)、未開始事務;

乙個資料版本的row trx_id落在已提交集合則資料是可見的,落在未開始集合資料不可見,落在為提交事務集合則分為兩種情況(落在集合並不一定表示一定在集合只能說明比高水位的row trx_id小):在陣列中表示該版本由還未提交的事務生成 不可見,不在集合中表示由已提交的事務生成 可見(這裡其實搞的不是很明白,,,記錄下來)。所以innodb利用所有資料多版本的特性,秒級建立了快照

這種說法更淺顯一點:乙個資料版本,對於資料檢視來說除了自己的更新可見以外有以下三種情況:

1、版本未提交 不可見

2、版本已提交,在檢視陣列建立之後提交 不可見

3、版本已提交,在檢視陣列建立之前提交 可見

注:更新資料時有一條邏輯--更新資料時總是先讀後寫,而這個讀指的是 當前讀;必須要讀取最新版本的資料,且必須加鎖

其實這就和可重複讀隔離級別就有點相悖了;那事務的可重複讀的隔離級別是怎麼實現的?

即:可重複讀的核心是一致性讀,事務在更新資料時只能用當前讀,如果當前記錄的行鎖被其他事務占用,那就需要進入所等待

另--讀提交和可重複讀的區別:

1、可重複讀隔離級別下,只需要事務開始時建立一致性檢視,後續事務裡的其他查詢操作都共用這乙個檢視

2、讀提交隔離級別下,每次執行語句前都會建立乙個新的檢視

小小結:

開始也做了乙個小結,這裡提乙個小點:表結構不支援「可重複讀」的原因是,表結構沒有對應的行資料,也沒有row trx_id 所以只有遵循當前讀的邏輯

參考林曉斌《mysql45講》 

事務的隔離級別舉例 事務的隔離級別

乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...

mysql事務隔離最高 Mysql事務隔離級別

mysql官方文件顯示 innodb中每個隔離級別的詳細描述如下 read uncommitted select語句以非鎖定方式被執行,但是乙個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為 髒讀 dirty read 另外,這個隔離級別象read commit...

事務的隔離級別舉例 JDBC 事務隔離級別

本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...