MySql 事務詳解與 MVCC 多版本併發控制

2021-10-03 12:37:20 字數 2357 閱讀 8147

原子性(atomicity):事務包含的所有操作要麼全部成功,要麼全部失敗回滾。

一致性(consistency):事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。

隔離性(isolation):事務之間相互隔離不被干擾。

永續性(durability):永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。

髒讀:a 事務讀取了 b 事務沒有提交的資料,然後 b 事務回滾了操作,導致 a 事務讀取到的資料是錯誤的。

不可重複讀:a 事務讀取了資源,然後在執行別的操作,此時 b 事務修改或刪除了這個資源,然後 a 事務再次讀取該資源,前後兩次讀取到的資料不一致。

幻讀:a 事務讀取了某一範圍的資料後,b 事務在該範圍內又插入了資料,a 事務再去讀取這一範圍資料的資料發現不一致。

read uncommitted(未授權讀取、讀未提交),會出現幻讀、髒讀、不可重複讀。

read committed(授權讀取、讀提交),會出現幻讀和不可重複讀。

repeatable read(可重複讀取),會出現幻讀,mysql 預設的。

serializable(序列化)。

mvcc 多版本控制器全稱叫 mutli version concurreny control。所謂多版本其實是指每一行資料被多個事務操作後產生了多個版本。read committedrepeatable read兩種隔離級別就是採用 mvcc 來實現的。

每一行資料都有兩個或者三個隱藏字段。

db_trx_id:最近對這條資料進行過增刪改的事務 id,刪除是一種特殊的更新。

db_roll_ptr:回滾指標。每一行資料經過增刪改之後都會在undo-log產生乙個快照,回滾指標就是指向上乙個快照的位址。

db_row_id:如果這行資料沒有主鍵或者唯一索引,系統會自動為這行資料生成乙個 db_row_id,這個 id 是自增的。

在進行增刪改操作的時候,系統會生成乙個 事務id。在某個時間段內如果有多個事務同時在運算元據庫,如生成了[100,101,102,103,104,105]六個事務 id,每乙個資料都對user表中id=1的資料進行了更新操作,其中101,103,104提交了事務。

每次客戶端連線伺服器的時候,都會建立乙個 session 連線,建立連線時會生成乙個一致性檢視 read-view。read-view 中包含了這次 session 連線之前所有未提交的事務陣列 [100,102,105]最大事務 id max_db_trx_id=105最小事務 id min_db_trx_id=100。這個 session 在查詢資料的時候,會將 read-view 中的資料和資料行中的事務 idrow_trx_id比較,如果:

row_trx_id < min_db_trx_id,該資料行中的事務 id 小於一致性檢視中的最小事務id,表示這行資料在這個 session 連線時就已經提交過了,這行資料是可見的。

row_trx_id > max_db_trx_id,該資料行中的事務 id 大於一致性檢視中的最大事務id,則表示這行資料是在這個 session 連線之後修改或者新增的資料,不可見。

min_db_trx_id < row_trx_id < max_db_trx_id,該資料行中的事務 id 大於檢視中的最小事務 id 且小於檢視中的最大事務 id,則有兩種情況要區分。

如果 row_trx_id 在一致性檢視中未提交事務 id 陣列中,則表示當 session 連線時,這行資料還沒有被提交,資料不可見。

如果 row_trx_id 不在一致性檢視的未提交事務 id 陣列中,則表示當 session 連線時,這行資料已經被提交了,資料可見。

每當遇到資料不可見的情況,則根據當前行資料的 db_roll_ptr 回滾指標去 undo-log 中找上乙個版本的資料,做同樣相同的對比操作,直到找到資料為止。

rc 和 rr 兩個隔離級別的差別:在 rr 可重複讀級別時,只有 session 連線時會生成乙個 read-view 一致性檢視快照,後面會一直沿用這個快照。而在 rc 讀提交隔離級別的時候,每一次增刪改查操作都會更新連線時的一致性檢視快照,這樣就造成了可以讀取到其它事務提交的資料的現象。

詳解MySQL事務的隔離級別與MVCC

程式設計客棧 對於使用innodb儲存引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列 總結一下 mvcc總結 所謂的mvcc指的就是在使用 read committed 和repeatable read 這兩種隔離級別的事務在執行普通的select 操作時訪問的記錄的版本鏈的過程,這樣子可以...

mvcc原理 MySql事務以及MVCC機制與原理

事務 事務是一組原子性sql查詢語句,被當作乙個工作單元。若mysql對改事務單元內的所有sql語句都正常的執行完,則事務操作視為成功,所有的sql語句才對資料生效,若sql中任意不能執行或出錯則事務操作失敗,所有對資料的操作則無效 通過回滾恢復資料 事務有四個屬性原子性 事務被認為不可分的乙個工作...

mysql 事務及其MVCC原理

mysql事務分為四類 4種隔離級別 1.未提交讀 read uncommitted ru ru sessiona a讀取b中update中未commit中的資料,讀到的 若此時b進行了rollback回滾操作。a中讀取到的值依然是b 修改後的這個值,這就是所謂的髒讀 sessionb update...