資料庫 事務

2022-07-12 17:54:18 字數 2988 閱讀 2875

資料庫事務基本也是資料庫基礎的一部分,雖然程式設計的時候注意的地方比較少。但是面試問題是真的多,幾乎是必中。

事務的作用大家都比較清楚,而且不只是資料庫才有事務一說,分布式事務、redis事務也都有,所以事務是一種概念

但是難點都是在mysql的事務實現原理,為了實現事務,mysql都用什麼來實現的。

事務的特性,與mysql的實現原理

a原子性:乙個事務中的操作,要麼都完成,要麼都不做。

c一致性:事務保證資料的一致性,乙個事務處理完成後資料保證一致且合法的(其實也都是相對的)。

i隔離性:兩個事務同時操作互相不影響。

d永續性:事務做完的操作能夠持久化儲存。

實現原理:

永續性實現通過redolog。redolog記錄了事務做了哪些操作,但是還沒有重新整理到資料庫檔案中的,即使是宕機等事故未進行資料檔案的更新,也可以根據redolog日誌進行更新資料庫檔案內容。

原子性實現通過undolog。如果事務確定需要完成使用redolog去重新整理資料庫檔案,但是當資料庫決定回滾事務的話,就會使用undolog,undolog記錄事務中資料修改前的記錄內容,需要回滾事務的時候使用undolog記錄的內容恢復資料庫檔案內容即可。

隔離性實現是根據隔離級別的不同,而使用了不同的實現方式,在事務隔離界別中詳細講述實現原理。

一致性其實是一種資料庫最終的狀態,它是通過前面三個性質結合起來實現的,所以它沒有單獨的實現方法,因為前面三個特性實現了它就實現了(所以個人感覺一致性就是拿出湊數的乙個性質啊)。

事務隔離級別問題理解三步走:

事務無隔離的情況下產生的問題

1.更新丟失:兩個事務同時修改同一資料,乙個事務覆蓋另乙個事務修改的資料。

2.髒讀:兩個事務ab同時執行,事務a修改資料,事務b讀取了修改後的資料進行處理,事務a回滾而事務b仍然用修改的資料處理。

3.不可重複讀:事務a讀取資料,事務b對該資料進行修改,事務a再次讀取該資料發現與原來的對不上了。

4.幻讀:事務a根據條件查詢資料行總共有10個,事務b增加了乙個資料行,事務a再次查詢資料行總共有11個。

事務的隔離級別實現原理

1.資料庫鎖,在 資料庫-鎖 一文中進行介紹。

2.多版本併發控制mvcc,它用在可重複讀和讀已提交這兩個隔離級別下。實現原理是依靠記錄行隱藏的事務id欄位和rollback指標字段,和undolog記錄的版本資訊,還有readview來獲取當前可讀取記錄資訊實現的。

執行過程如下:

a.準備一行記錄,1,2,3;1,null,null 前面三個欄位是資料行資料,後面三個分別是 資料行隱藏id,事務id,回滾指標

b.事務a更新記錄為所有資料*10,則記錄行記錄為 10,20,30;1,a,1,事務id更新了,回滾id更新為undolog指標記錄,所以undolog中記錄 1;1,2,3;1,null,null,第乙個欄位為undolog的id當然這個是我虛構出來的,實際上咩有這個字段,視為了更好的表述回滾指標,接著六個為元資料行的老資料。

c.事務b更新記錄為所有資料+1,則記錄行記錄為 11,21,31;1,b,2,事務id又一次更新了,回滾id,更新為undolog指標記錄,所以這是unlolog記錄如下:

2;10,20,30;1,a,1

1;1,2,3;1,null,null

d.當ab事務中有查詢,就會建立乙個readview,readview作用就是根據當前事務id和記錄隱藏id配合undolog查詢記錄行結果。結合記錄行和undolog中記錄得到乙個讀取檢視。這樣就避免了讀取其他事務修改的資料。區別點在於在可重複讀隔離級別,只有第一次查詢的時候建立一次readview後面再次查詢就不會建立直接讀取前一次的即可,這樣效率高,但是就算另乙個事務提交了,再查詢也得不到新提交的資料更新結果;而在讀已提交隔離級別下每次查詢的時候都會重新建立一次readview,這樣另個一事務提交的資料就能夠獲取到。

可以看出,記錄行回滾指標指向undolog,乙個記錄行在undolog中會有多行老版本的記錄,每一行老版本都會根據回滾指標指向更老的資料記錄。

提交操作:commit實際上是沒有做任何事,因為記錄行上實際上已經更新過了的。

回滾操作:rollback操作提交後,會根據事務id去undolog中查詢回滾段,並且回滾對應的記錄資訊。

undolog維護:新增,開啟事務的任何增刪改都會新增該日誌行,有乙個purge執行緒一直在掃瞄undo日誌,清理比當前執行的事務最小id的對應記錄都清除掉,避免它無限增大。

redolog維護:當有任何寫操作都會記錄在redolog當中,它的大小是固定的,用於迴圈寫,作用是當資料庫宕機可以用它來恢復提交但是還沒有存檔的事務記錄。

理想mvcc實現差異:理想mvcc是每個事務將記錄行都copy乙個副本進行修改,但是理想mvcc對多行修改和回滾操作無能為力,所以mysql沒有按照最理想的mvcc來實現。

事務隔離級別及解決問題

ru-讀未提交:除了使用鎖,其他都沒有使用,修改和讀取都是在原行上進行操作。所以會有髒讀、不可重複讀和幻讀。

rc-讀已提交:使用鎖和mvcc,避免了髒讀,但是有不可重讀和幻讀問題。

rr-可重複讀:使用鎖和mvcc,避免了髒讀和不可重複讀問題,另外使用間隙鎖也可以避免幻讀問題。

ser-序列化:事務都是序列化處理,所以沒有併發問題,但是效率非常低,極少使用。

事務的傳播級別

傳播級別一般是在例如spring等框架中使用的,規定的就是當前做的資料庫處理,若沒有在事務內怎麼處理,若已經在乙個事務內怎麼處理。

1.若沒有在事務內,處理方式就是三種:建立新事務來執行;以非事務形式執行;丟擲異常。

2.若已經在乙個事務內,處理方式有四種:在該事務內執行;將該事務掛起,以非事務形式執行;在該事務內新建乙個事務巢狀執行;丟擲異常。

一般七種事務傳播界別,就是這幾種處理方式的組合。即為若有事務則從1中選擇一種方式,若沒有事務則從2中選擇一種方式。

一般預設事務型別,如果沒有,就新建乙個事務;如果有,就加入當前事務。適合絕大多數情況。

參考資料

什麼是事務的傳播特性

spring的事務傳播性與隔離級別

mysql中的mvcc

mysql innodb mvcc 機制的原理及實現

資料庫事務

事件是訪問並可能更新各種資料項的乙個程式執行單元。事件由事務開始與事務結束之間執行的全體操作組成。為了保證資料完整性,資料庫系統需要維護事務的以下性質 原子性 atomicity 事務中的操作要麼全部成功,要麼全部失敗。一致性 consistency 事務執行前後要保持資料庫的一致性。隔離性 iso...

資料庫 事務

資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成...

資料庫事務

這段時間面試,由於基礎不是特別好,遇到一些要筆試的公司。就會表示出來 今天有人問我,資料庫事務 是什麼。我只感覺十分熟悉。但是又說不出所以然。回來找了一下,現在整理記錄 1 定義 資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務...