mysql事務隔離級別及原理

2021-10-09 18:47:23 字數 2661 閱讀 2146

參考:

目錄

1、事務:資料庫邏輯的基本單元,acid;

問題一:mysql怎麼保證一致性?

問題二: mysql怎麼保證原子性?

問題三: mysql怎麼保證永續性?

問題四: mysql怎麼保證隔離性?

2、mysql預設隔離級別--可重複讀:

3、mysql如何解決幻讀 + 總結幾種隔離級別如何出現的邏輯

原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability

除了基礎的定義,這四大特性在資料庫中的實現原理是怎麼樣的?沒有幾個人能夠答得上來。因此,我們這篇文章著重討論一下四大特性在mysql中的實現原理。

a - 原子性:根據定義,原子性是指乙個事務是乙個不可分割的工作單位,其中的操作要麼都做,要麼都不做,不存在中間的狀態。

c - 一致性(四個中的最終目標,其他aid都是為了實現c):根據定義,一致性是指事務執行前後,資料處於一種合法的狀態,這種狀態是語義上的而不是語法上的。

那什麼是合法的資料狀態呢?這個狀態是滿足預定的約束就叫做合法的狀態,再通俗一點,這狀態是由你自己來定義的。滿足這個狀態,資料就是一致的,不滿足這個狀態,資料就是不一致的!

i - 隔離性:根據定義,隔離性是指多個事務併發執行的時候,事務內部的操作與其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

d -永續性:根據定義,永續性是指事務一旦提交,它對資料庫的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

這個問題分為兩個層面來說。

但是,如果你在事務裡故意寫出違反約束的**,一致性還是無法保證的。例如,你在轉賬的例子中,你的**裡故意不給b賬戶加錢,那一致性還是無法保證。因此,還必須從應用層角度考慮。

利用innodb的undo log,undo log是用來記錄資料更新前的值,保證資料更新失敗能夠回滾

undo log名為回滾日誌,記錄了回滾所需要的相應日誌資訊。根據undo log,當事務回滾時能夠撤銷所有已經成功執行的sql語句。

舉個例子:

undo log記錄了這些回滾需要的資訊,當事務執行失敗或呼叫了rollback,導致事務需要回滾,便可以利用undo log中的資訊將資料回滾到修改之前的樣子。

利用innodb的redo log,redo log用來記錄某資料塊被修改後的值,可以用來恢復未寫入 data file 的已成功事務更新的資料。

問題:正如之前說的,mysql是先把磁碟上的資料載入到記憶體中,在記憶體中對資料進行修改,再刷回磁碟上。如果此時突然宕機,記憶體中的資料就會丟失。怎麼解決這個問題?簡單啊,事務提交前直接把資料寫入磁碟就行啊。這麼做有什麼問題?

於是,決定採用redo log解決上面的問題。

具體做法:當做資料修改的時候,不僅在記憶體中操作,還會在redo log中記錄這次操作。當事務提交的時候,會將redo log日誌進行刷盤(redo log一部分在記憶體中,一部分在磁碟上)。當資料庫宕機重啟的時候,會將redo log中的內容恢復到資料庫中,再根據undo logbinlog內容決定回滾資料還是提交資料。

採用redo log的好處:將redo log進行刷盤比對資料頁刷盤效率高,具體表現如下

利用的是鎖和mvcc機制。

mvcc,即多版本併發控制(multi version concurrency control),乙個行記錄資料有多個版本對快照資料,這些快照資料在undo log中。 如果乙個事務讀取的行正在做delele或者update操作,讀取操作不會等行上的鎖釋放,而是讀取該行的快照版本。 由於mvcc機制在可重複讀(repeateable read)和讀已提交(read commited)的mvcc表現形式不同,就不贅述了。

但是有一點說明一下,在事務隔離級別為讀已提交(read commited)時,乙個事務能夠讀到另乙個事務已經提交的資料,是不滿足隔離性的。但是當事務隔離級別為可重複讀(repeateable read)中,是滿足隔離性的。

對於其他事務的修改,讀不到;

對於其他事務的新增,能讀到 -->幻讀--->mysql解決幻讀辦法:行鎖 + 間隙鎖(有索引的、沒索引的)

mysql在rr的隔離級別下,究竟是通過mvcc解決幻讀的還是通過行鎖的next key演算法解決的? - yangsoon的回答 - 知乎

總結:

MySQL事務及事務隔離級別

原子性 atomicity 事務是乙個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。一致性 consistent 在事務開始和完成時,資料都必須保持一致狀態。這意味著所有相關的資料規則都必須應用於事務的修改,以保持資料的完整性 事務結束時,所有的內部資料結構 如b樹索引或雙向鍊錶 也都...

mysql 事務及隔離級別

原子性 回滾日誌 undo log 永續性 重做日誌 redo log 隔離性 鎖 一致性 通過aid及使用者自定義完整性保證 一致性是事務追求的最終目標 前面提到的原子性 永續性和隔離性,都是為了保證資料庫狀態的一致性。此外,除了資料庫層面的保障,一致性的實現也需要應用層面進行保障。一致性是指事務...

mysql 事務及隔離級別

事務 transaction 是由一系列對資料庫中的資料進行操作訪問所組成的乙個程式執行單元 在同乙個事務中所進行的操作,要麼都成功,要麼就什麼都不做。理想中的事務必須滿足四大特性,這就是大名鼎鼎的acid。a atomicity 原子性 是指乙個事務要麼全部執行,要麼不執行,也就是說乙個事務不可能...