MySQL 事務 隔離級別 MVVC是怎麼回事?

2022-09-23 11:27:09 字數 2053 閱讀 4132

事務會把資料庫從一種一致狀態轉換為另一種一致狀態。

一致性隔離性

永續性帶有儲存點的扁平事務

鏈事務巢狀事務

分布式事務

​ 事務的隔離性由鎖來實現。而原子性、一致性、永續性通過資料庫的redo log和undo log來完成。

​ redo log稱為重做日誌,用來保證事務的原子性和永續性。

​ undo log用來保證事務的一致性。

​ redo恢復提交事務修改的頁操作,而undo回滾行記錄到某個特定版本。redo通常是物理日誌,記錄的是頁的物理修改操作,undo是邏輯日誌,根據每行記錄進行記錄。

​ 重做日誌用來實現事務的永續性,其有兩部分組成:

innodb是事務的儲存引擎,其通過force log at commit機制實現事務的永續性,即當事務提交(commit)時,必須先將該事務的所有日誌寫入到重做日誌檔案進行持久化,待事務的commit操作完成才算完成。

特點:​ 重做日誌記錄了事務的行為,可以很好地通過其對頁進行「重做」操作。但是事務有時候還需要進行回滾操作,這時就需要undo。

​ 因此在對資料庫進行修改時,innodb儲存引擎不但會產生redo,還會產生一定量的undo。如果使用者執行的事務或者語句由於某種原因失敗了,又或者使用者用一條rollback語句請求回滾,就可以利用這些undo資訊將資料回滾到修改之前的樣子。

​ 除了回滾,undo log另外乙個作用就是mvcc。當使用者讀取一行記錄的時候,若該記錄已經被其他事務所占用,當前事務可以通過undo讀取之前的行版本資訊,以此實現非鎖定讀取。

事務a和b的時序關係如下圖,那麼在b提交之後,a能否看到b事務修改的值呢?

答案是不同隔離級別下快照資料不同,根據可見性演算法來判斷。

在innodb引擎中,每一行記錄上都會包含幾個使用者不可見的字段,如上圖所示。隱藏主鍵指的是如果在建立表的時候沒有主鍵索引,那麼就根據非空的列建立索引,如果沒有非空的列,那麼innodb通過隱藏的row_id來建立乙個隱藏的主鍵索引。

回滾指標

假設現在有一行資料,事務1新增進來的,其結構如下。

假設現在來了乙個事務2,對上面的行執行修改操作,整個過程如下圖

再來乙個事務3

問題:如果現在有了事務4,那麼事務4讀取到的是哪乙個版本的資料?

答案:在上面的事務123演示的過程中,並沒有提到事務是否提交,事務開啟的時機。那麼事務4讀取哪個版本資料,一定有相應的規則。

事務在進行快照讀的時候會產生讀檢視

案例演示

問當前快照讀能否讀取到剛剛修改的記錄值

根據下面的可見性演算法分析,可以得出結論

結果分析

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

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

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...