Mysql事務實現原理及設計

2021-10-10 18:51:01 字數 1482 閱讀 5821

一、事務基本概念

事務特性:aidc(原子性、 隔離性、永續性、一致性)

併發問題:髒讀:讀取到未提交的資料。

不可重複讀:兩次讀取的結果不同。

幻讀:select操作得到的結果表徵的資料狀態無法支撐後續的業務操作。

隔離級別:

未提交讀:最低隔離級別,會讀取到其他事務為提交的資料。髒讀

提交讀:事務過程中可以讀取到其他事務已提交的資料。不可重複讀

可重複讀:mysql預設隔離級別。每次讀取相同的結果集,不管其他事務是否提交。幻讀

序列化:事務排隊,隔離級別最高,效能最差。

二、事務實現原理(或者說實現的依靠)

1.mvcc:多版本併發控制,以隱藏列的方式解決讀寫衝突。

(1)當前讀:讀取的是記錄資料的最新版本,並且當前讀返回的記錄都會加上鎖,保證其他事務不會再併發的修改這條記錄。

(2)快照讀:讀取的是記錄資料的可見版本(可能是過期的資料),不用加鎖。

(3)可見性判斷:

不可見的事務:建立快照這一刻,還未提交的事務;建立快照之後建立的事務。不可見時就查快照讀。

可見的事務:根據活躍事務列表、列表中最小事務id、列表中最大事務id進行判斷。小於活躍事務最小事務id,大於最小事務id小於最大事務id且不在活躍事務列表的事務。

2.undo log:innodb的回滾日誌。藉此可實現資料的多版本。

delete undo log用於回滾,提交即清理。

update undo log用於回滾,同時實現快照讀,不能隨便刪除。刪除的條件:根據活躍事務列表的最小事務id,小於最小事務id即可刪除。

引出乙個問題:

為什麼innodb的count(*)的速度慢?

因為mvcc多版本的原因,並且會只返回可見的行數,所以行數會出現變動。

3.redo log:保證事務的永續性。

記錄事務資料的修改,用於異常恢復,保證事務執行不會失敗。

innodb從操作到寫入磁碟流程:

commit將事務操作記錄迴圈寫入檔案,如下圖:刷盤會覆蓋原有的資料,事務提交之後這些操作修改已無意義。

刷盤時機:一般配置2。0出問題時會丟一秒鐘的資料。1開銷大。2比較柔和。

redo log的意義:體積小,紀錄頁的修改,比寫入頁代價低;修改末尾追加,隨機寫變順序寫。

MySQL事務實現原理

以上是sql 92標準中定義的四種隔離級別。在mysql中,預設的隔離級別是repeatable read 可重複讀 並且解決了幻讀問題。不可重複讀重點在於update和delete,而幻讀的重點在於insert insert update delete 快照讀和當前讀 鎖定讀一致性非鎖定讀假如乙個...

spring事務實現原理

如果你用過spring aop,那麼理解註解事務就十分簡單了。事務註解本質上實在事務方法加入乙個around切面,在方法開始前開始事務,在丟擲異常後回滾事務。使用簡單偽 可以簡單理解為 dowithtransaction catch exception ex spring transaction有各...

資料庫事務實現原理

資料庫事務是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。這些操作要麼全部執行,要麼全部不執行,是乙個不可分割的工作單位。典型特性有原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durabilily 簡稱acid。原子性 事...