mysql資料庫事務的實現原理

2021-09-22 10:15:40 字數 1545 閱讀 1755

資料庫事務在日常的作業中可或缺,我們了解事務只是停留在上課時候的事物的幾種特性:原子性、隔離性、一致性、永續性,也知道資料庫會有乙個預設的隔離級別,那麼為什麼要有四種特性,以及預設的隔離級別的作用(可能會清楚是避免幻讀等等),我相信有一部分同學是不清楚的,所以如果我們了解了這些特性背後的東西,那麼日後對於資料庫的應用會更加的得心應手,所以藉此機會談一談我自己的理解,整理成文章,如有不嚴謹的地方,還望批評改正。

資料庫事務的場景有很多,使用事務一般出現在對於資料庫的更新問題上,新增、刪除、修改,一般都用在對於資料庫包含多個更新操作的時候使用事務,以保證多個更新操作的能完成或者失敗之後不會影響資料庫原來的狀態。當然這裡的資料庫不是侷限的資料庫,有可能是分庫分表的多個物理庫,還有可能是分布式的資料庫,大家需要認真體會,結合實際情況。下面用具體的例子:

以 innodb引擎為例對事務的實現進行說明。我們知道事務的四個特點,那麼這四個特點背後的意義是什麼呢?首先我們得知道 實際執行事務的環境是什麼樣子的,很顯然,當前的資料庫支援的都是併發的事務,也就多個事務同時在運算元據庫,因此就會出現多個事務 對資料庫的同一內容進行操作,所以實現事務的的四個特性,也是基於事務的特點來設計的。下面基於事務的四個特性背後的原理以及機制進行說明:

原子性是事務的基本特性,保證了事務中的操作是不可拆分的整體,那麼原子性是如何實現的呢?事務的原子性表現的兩個方面:

隔離性與一致性是事務的特性,之所以要將其放在一起,是因為這兩種特性相互制約,所以如何平衡他們之間的gap需要我們自身的經驗去判斷。那為什麼這麼說呢,上文說過,對於單個事務來說甚至隔離性都不需要,但是對於多個事務並行執行的大場景來說,如果不用的事務對資料庫同一資料進行讀寫,那麼一致性就容易造成破壞,所以事務的隔離級別,意味著事務的併發處理是不一樣,而不同的併發處理方式對於資料庫的一致性是有影響的。那麼就來說一說,不同的隔離級別是如何影響事務之間的併發程度的:

通過上文,我們知道不同的隔離級別對於讀寫有不同的加鎖方式,那麼下面我們看看這些鎖到底有什麼作用,之間有什麼不同,並結合上文的隔離級別,理解其對於一致性和效能如何造成影響?

搞清楚了各個隔離級別 下的鎖的使用情況,那麼在預設的隔離級別下,innodb如何實現事務的隔離性並保證其高效的併發性呢,那麼就應該談一談mvcc多版本控制,基於此有必要了解一下多版本控制的概念。

innodb儲存的最基本row中包含一些額外的儲存資訊 data_trx_id,data_roll_ptr,db_row_id,delete bit

6位元組的data_trx_id 標記了最新更新這條行記錄的transaction id,每處理乙個事務,其值自動+1

7位元組的data_roll_ptr 指向當前記錄項的rollback segment的undo log記錄,找之前版本的資料就是通過這個指標

6位元組的db_row_id,當由innodb自動產生聚集索引時,聚集索引包括這個db_row_id的值,否則聚集索引中不包括這個值.,這個用於索引當中

delete bit位用於標識該記錄是否被刪除,這裡的不是真正的刪除資料,而是標誌出來的刪除。真正意義的刪除是在commit的時候

mysql資料庫事務原理(一)

原子性 穩定性和永續性是通過redo 和 undo 日誌檔案實現的,不管是redo還是undo檔案都會有乙個快取我們稱之為redo buf和undo buf。同樣,資料庫檔案也會有快取稱之為data buf。undo記錄了資料在事務開始之前的值,當事務執行失敗或者rollback時可以通過undo記...

資料庫事務實現原理

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

資料庫事務ACID的實現原理

事務的 acid 是通過 innodb 日誌和鎖來保證。undo log的原理 undo log 的原理很簡單,為了滿足事務的原子性,在操作任何資料之前,首先將資料備份到乙個地方 這個儲存資料備份的地方稱為 undo log 然後進行資料的修改。如果出現了錯誤或者使用者執行了 rollback 語句...