mysql筆記系列 六 事務隔離級別和mvcc

2021-10-03 16:11:45 字數 1687 閱讀 2724

1.事務隔離級別和鎖

事務的啟動

begin/start transtanction 命令並不是乙個事務的起點,要在執行到第一條對涉及表的操作的時候開開始。

如果要立刻開始乙個事務,命令是start transtaction whth consistent snapshot 。

也就是第一種方式:事務的一致性檢視是在第乙個快照讀語句時建立的

第二種方式:是在命令start transtaction whth consistent snapshot 執行時建立的。

mysql中 有兩個檢視的概念

乙個是view,是用查詢語句定義的虛擬表,在呼叫的時候執行查詢語句並生成結果,建立檢視的方式是creat view,查詢方式與其他表無異。

另乙個是innodb在實現mvcc時用到的一致性檢視,即consistent read view ,用於支援read commit 和

repeatable read 可重複讀。隔離級別的實現。

mvcc(併發版本控制)的原理:

在innodb中,每乙個事務都有事務id, transaction id, 是在事務開始時候在innodb的事務系統申請的 是嚴格遞增的。每次事務更新資料的時候,就會生成乙個新的資料版本,並把事務id賦予這個版本,存在row_trx_id列。

也就是,資料的每行的資料其可能有多個版本,每個版本都有自己的row_trx_id。

每個事務檢視並不是真實存在的,是每次需要的時候根據當前版本和undolog計算出來的。

可重複讀:

事務啟動的時候,可以讀到所有已經提交的事務結果,但是這個事務執行期間,其他事務的更新結果對這個事務不可見。

實現原理就是,只能讀到row_trx_id版本比這個事務早的版本,如果不是,則向前找到這個記錄的上乙個版本,看其row_trx_id是否符合,如果不符合就繼續往前找。

真實場景下:mysql innodb引擎會建立乙個陣列,用來儲存這個事務開啟時刻,正在執行的事務id,

有了這個陣列,那麼這個陣列中事務id最小值-1 的id, 就是已提交的事務,說明可以讀。

這個事務id最大值+1的事務id,的就是新建立的事務,不可以讀。

如果處在這個陣列裡面,說明是正在執行的事務id,還沒提交,也不可讀。

這樣就滿足了,可重複讀的操作,因為在這個開啟事務的時間後的更新,對它都不可見,可以保證事務期間讀取的資料不變。

簡單的來說就是:

1.版本未提交,不可見

2.版本已提交,但是在檢視建立後提交的,不可見

3.版本已提交,但是在檢視建立前提交的,可見。

那麼讀提交的隔離級別實現:

每一行語句執行的時候都建立乙個一致性檢視,這樣就能刷出來最新的提交記錄。

可重複讀只在事務開啟的時候建立一致性檢視。

注意:更新資料都是先讀後寫的,這個讀 只能讀當前的資料,稱為當前讀。

select如果加了鎖,也是當前讀, 當前讀 會被行鎖阻塞, 一次只有乙個執行緒能夠進行當前讀,確保讀到的資料是最新的。

小結:1.innodb 的行資料有多個版本,每個資料版本有自己的 row trx_id,每個事務或者語句有自 己的一致性檢視。普通查詢語句是一致性讀,一致性讀會根據 row trx_id 和一致性檢視確 定資料版本的可見性。

2. 對於可重複讀,查詢只承認在事務啟動前就已經提交完成的資料;

對於讀提交,查詢只承認在語句啟動前就已經提交完成的資料;

3.而當前讀,總是讀取已經提交完成的最新版本

php mysql隔離 MySQL事務隔離級別

事務併發導致的問題是資料庫需要重點解決的問題,關於事務處理的技術都已經非常成熟了,四種隔離級別再加上乙個快照是所有資料庫 mysql commit query ok,0 rows affected 0.04 sec mysql select from innodb where name age fz...

npm mysql 事務 mysql事務隔離級別

準備命令 檢視隔離級別 select global.tx isolation,tx isolation 修改當前會話隔離級別 set session tx isolation read uncommitted set session tx isolation read committed set s...

MYSQL事務以及隔離級

事務是一組原子性的sql查詢語句,也可以被看做乙個工作單元。如果資料庫引擎能夠成功地對資料庫應用所有的查詢語句,它就會執行所有查詢,如果任何一條查詢語句因為崩潰或其他原因而無法執行,那麼所有的語句就都不會執行。也就是說,事務內的語句要麼全部執行,要麼一句也不執行。例 將b表中符合條件的記錄搬移到a表...