MySQL事務理論

1、事務的ACID屬性

事務是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性。

1)原子性

事務是一個原子操作單元,其對數據的修改,要麼全都執行,要麼都不執行。

2)一致性

在事務開始和完成時,數據必須保持一致狀態。這意味着所有相關的數據規則都必須應用於事務的修改,以保持數據的完整性;事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)也都必須是正確的。
一致性是最難理解的。這裏引用網上說的比較好理解的解釋,

一致性就是:應用系統從一個正確的狀態到另一個正確的狀態。而ACID就是說事務能夠通過AID來保證這個C的過程。C是目的,AID都是手段。

3)隔離性

數據庫系統提供一定的隔離機制,保證事務在不受外部併發操作影響的“獨立”環境執行。這意味着事務處理過程中的中間狀態對外部是不可見的。

4)持久性

事務完成之後,它對於數據的修改是永久性的,即使出現系統故障也能夠保持。

2、併發事務帶來的問題

1)更新丟失

當兩個或者多個事務選擇同一行,然後基於最初選定的值更新該行時,由於每個事務都不知道其他事務的存在,就會發生丟失更新問題,最後的更新覆蓋了由其他事務所做的更新。

例如,兩個程序員修改同一個java文件。每個程序員獨立地更改其副本,然後保存更改後的副本,這樣就覆蓋了原始文檔。最後保存其更改副本的編輯人員覆蓋前一個程序員所做的更改。

如果在一個程序員完成並提交事務之前,另一個程序員不能訪問同一個文件,則可避免此問題。

2)髒讀

一個事務正在對一條記錄做修改,在這個事務完成並提交前,這條記錄的數據就處於不一致狀態。這時候,另一個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些“髒”數據,並做了進一步處理,就會產生未提交數據依賴關係。這種現象就叫做“髒讀”。

一句話:事務A讀取到了事務B已修改但尚未提交的數據,還在這個數據基礎上做了操作。此時,如果B事務回滾,A讀取的數據無效,不符合一致性要求。

3)不可重複讀

一個事務在讀取某些數據後的某個時間,再次讀取以前讀過的數據,卻發現其讀出的數據已經發生了改變,或某些記錄已經被刪除了。這種現象就叫做“不可重複讀”。

一句話:事務A讀取到了事務B已經提交修改的數據,不符合隔離性。

4)幻讀

一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱爲“幻讀”。

一句話:事務A讀取到了事務B提交的新增數據,不符合隔離性。
幻讀和髒讀有點類似,髒讀是事務B裏面修改了數據,幻讀是事務B裏面新增了數據。

3、事務隔離級別

“髒”、“不可重複讀”、“幻讀”,其實都是數據庫讀一致性問題,必須由數據庫提供一定的事務隔離機制來解決。
在這裏插入圖片描述
數據庫的事務隔離越嚴格,併發副作用越小,但付出的代價也就越大,因爲事務隔離實質上就是使事務在一定程度上“串行化”進行,這顯然與“併發”是矛盾的。同時,不同的應用對讀一致性和事務隔離程度的要求也是不同的,比如許多應用對“不可重複讀”和“幻讀”並不敏感,可能更關心數據併發訪問的能力。

查看當前數據庫的事務隔離級別

show variables like 'tx_isolation';
發佈了71 篇原創文章 · 獲贊 37 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章