mysql事務四個特性 事務的四個特性

2021-10-17 21:35:46 字數 2367 閱讀 6807

事務的四個特性

1.原子性(atomicity)

1.1什麼是原子性

一般來說,原子是指不能分解成小部分的東西。這個詞在計算的不同分支中意味著相似但又微妙不同的東西。例如,在多執行緒程式設計中,如果乙個執行緒執行乙個原子操作,這意味著另乙個執行緒無法看到該操作的一半結果。系統只能處於操作之前或操作之後的狀態,而不是介於兩者之間的狀態。 acid原子性的定義特徵是:能夠在錯誤時中止事務,丟棄該事務進行的所有寫入變更的能力。

1.2 如何實現原子性

wal(預寫日誌) 是用於保證事務的原子性和永續性。簡單來講,事務更新資料之前,先寫日誌,然後在更新資料。當系統崩潰時,如果事務還沒寫wal,那整個資料依然一致。如果事務只寫了wal,未更新具體的資料頁後崩潰,那恢復流程可以根據wal日誌,重做相關操作,保證資料一致性。

2.一致性(consistency)

acid一致性的概念是,對資料的一組特定陳述必須始終成立。即不變數(invariants)。例如,在會計系統中,所有賬戶整體上必須借貸相抵。如果乙個事務開始於乙個滿足這些不變數的有效資料庫,且在事務處理期間的任何寫入操作都保持這種有效性,那麼可以確定,不變數總是滿足的。 原子性,隔離性和永續性是資料庫的屬性,而一致性(在acid意義上)是應用程式的屬性。應用可能依賴資料庫的原子性和隔離屬性來實現一致性,但這並不僅取決於資料庫。

3.隔離性(isolation)

3.1什麼是隔離性

大多數資料庫都會同時被多個客戶端訪問。如果它們各自讀寫資料庫的不同部分,這是沒有問題的,但是如果它們訪問相同的資料庫記錄,則可能會遇到併發問題(競爭條件(race conditions))。 acid意義上的隔離性意味著,同時執行的事務是相互隔離的:它們不能相互冒犯。

如果兩個事務不觸及相同的資料,它們可以安全地並行(parallel) 執行,因為兩者都不依賴於另乙個。當乙個事務讀取由另乙個事務同時修改的資料時,或者當兩個事務試圖同時修改相同的資料時,併發問題(競爭條件)才會出現。出於這個原因,資料庫一直試圖通過提供事務隔離(transaction isolation) 來隱藏應用程式開發者的併發問題。

serializable級別的隔離,保證事務的效果與連續執行(即一次乙個,沒有任何併發)是一樣的,可以保證事務地安全執行。但是在serializable隔離級別,事務併發度很低,整個資料庫的效能肯定不高。這時候,資料庫開發人員有提出了四種不同的隔離級別,來平衡事務併發度與隔離性,這四個隔離級別分別是:讀未提交(read uncommitted):可以讀取未提交的記錄。

讀已提交(read committed):事務中只能看到已提交的修改。

可重複讀(repeatable read):解決了不可重複讀問題(mysql 預設隔離級別)

序列化(serializable):最高隔離級別。

ru,rc和rr由於降低了隔離要求,自然在讀取資料時,會產生各種異常(上帝為你開啟一扇門的同時,肯定也為你關上一扇窗):ru會讀取其他事務未提交的資料,這就產生了髒讀,髒讀取意味著另乙個事務可能會只看到一部分更新,或者看到的資料已經被回滾了。

rc級別的隔離,會產生不可重複讀的問題。所謂不可重複讀是指在乙個事務內根據同乙個條件對行記錄進行多次查詢,但是搜出來的結果卻不一致。發生不可重複讀的原因是在多次搜尋期間查詢條件覆蓋的資料被其他事務修改了。

rr級別的隔離,會產生幻讀問題。幻讀,並不是說兩次讀取獲取的結果集不同,幻讀側重的方面是某一次的 select 操作得到的結果所表徵的資料狀態無法支撐後續的業務操作。更為具體一些:select 某記錄是否存在,不存在,準備插入此記錄,但執行 insert 時發現此記錄已存在,無法插入,此時就發生了幻讀。

3.2 如何支援隔離性

一般資料庫不會考慮工作在ru隔離級別,因為讀髒資料會引起太多的問題。資料庫一般工作在rc或rr隔離級別,快照隔離級別就可以支援rc或rr隔離級別,所以資料庫一般會實現快照隔離級別。

快照隔離的實現通常使用寫鎖來防止髒寫,這意味著進行寫入的事務會阻止另乙個事務修改同乙個物件。但是讀取不需要任何鎖定。從效能的角度來看,快照隔離的乙個關鍵原則是:讀不阻塞寫,寫不阻塞讀。這允許資料庫在處理一致性快照上的長時間查詢時,可以正常地同時處理寫入操作。且兩者間沒有任何鎖定爭用。

為了實現快照隔離,資料庫必須保留乙個物件的幾個不同的提交版本,因為各種正在進行的事務可能需要看到資料庫在不同的時間點的狀態。因為它併排維護著多個版本的物件,所以這種技術被稱為多版本併發控制(mvcc, multi-version concurrentcy control)。

最高的隔離級別:serializable,一般是通過2pl來實現, 一階段申請,一階段釋放。讀寫都要加鎖。

4.永續性(durability)

資料庫系統的目的是,提供乙個安全的地方儲存資料,而不用擔心丟失。永續性 是乙個承諾,即一旦事務成功完成,即使發生硬體故障或資料庫崩潰,寫入的任何資料也不會丟失。

5.總結

本文總結和梳理了事務的四個特性,並概述了如何實現事務的四個特性。

事務 事務的四個特性

現實生活中,我們往往經常會進行轉賬操作,轉賬操作可以分為兩部分來完成,轉入和轉出。只有這兩部分都完成了才可以認為是轉賬成功。在資料庫中,這個過程是使用兩條語句來完成的,如果其中任意一條語句出現了異常沒有執行,則會導致兩個賬號的金額不同步,造成錯誤。為了防止上面可能出現的情況,mysql引入了事務,所...

事務 四個特性

事務具有4個特徵,分別是原子性 一致性 隔離性和永續性,簡稱事務的acid特性 一 原子性 atomicity 乙個事務要麼全部提交成功,要麼全部失敗回滾,不能只執行其中的一部分操作,這就是事務的原子性 二 一致性 consistency 事務的執行不能破壞資料庫資料的完整性和一致性,乙個事務在執行...

mysql的事務四個特性以及事務的四個隔離級別

分別是原子性 一致性 隔離性 永續性。原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性...