数据库 / 事务的 ACID
一、什么是事務?
在數據庫系統里而言,事務是代表一個或者一系列操作的最小邏輯單元,所有在這個邏輯單元內的操作要么全部成功,要么就全部失敗,不存在任何中間狀態,一旦事務失敗那么所有的更改都會被撤消,一旦事務成功所有的操作結果都會被保存。
二、為什么要有事務?
如果無法直觀的從概念上理解事務的話,那我們可以嘗試從它解決問題的出發點來了解它。事務機制存在的目的就是無論我們的操作過程中是成功、失敗、異常、或是受到干擾的情況下,事務都能保證我們數據最終的一致性。
為了讓大家重視和理解事務的作用,所以我們必須看一個和錢有關的例子:
案例:轉賬
A 賬戶余額有1000元,B 賬戶余額 0 元,在這個基礎上 A 向 B 轉賬 400 元,流程如下:
1、查詢 A 賬戶余額,看金額是 >= 400 元。
2、滿足條件則先從 A 賬戶扣款 400 元(當前 A 余額 = 600、當前 B 余額 = 0)。
3、然后再向 B 賬戶增加 400 元(當前 A 余額 = 600、當前 B 余額 = 400)。
三、沒有事務支持的情況下會是什么樣?
如果上面每個操作都是獨立的,那么任意一個操作的失敗都不會影響下一步操作,這樣就可能會出現下面幾個場景:
情況一:在執行完第 2 步后,執行第 3 步系統發生異常失敗了,那么最后的結果 A 余額 = 600,B 賬戶余額 = 0;
情況二:在執行第 2 步失敗了,然后繼續執行第 3 步, 那么最后的結果 A 余額 = 1000,B 余額 = 400;
很明顯這樣直接會導致嚴重的問題,因為這樣的情況下系統會憑空減少或多出錢出來,所以我們需要一套事務機制來容許在異常情況下,能讓數據恢復到最初的樣子。
四、有事務支持的情況會是什么樣?
其實在這個操作中,轉賬就是本次一系列操作的最小邏輯單元,只有3個操作都成功了才算轉賬成功,任何一個步驟失敗都算整個轉賬操作失敗,只要其中任意一個步驟執行失敗都不會再往下執行,并對已經執行的數據變更進行恢復。
轉賬操作開始
1、查詢A賬戶余額,看金額是 >= 400 元 (失敗則整個轉賬失敗)。
2、滿足條件則先從 A 賬戶扣款 400 元(當前 A 余額 = 600、當前 B 余額 = 0)(失敗則整個轉賬失敗)。
3、然后再向 B 賬戶增加 400 元(當前 A 余額 = 600、當前 B 余額 = 400)(失敗則整個轉賬失敗,同時把上一步的扣款 400 返還給 A 賬戶)。
轉賬操作結束
這樣在事務的機制下,不管轉賬成功還是失敗系統數據最終都是一致的,錢才不會出現憑空變多或者減少,這也是事務存在的意義。
五、事務的特性(ACID)
要實現事務的最終目的,需要幾種機制組合才能實現,這幾種機制就是事務的幾個特性,分別原子性、隔離性、一致性、持久性。 用一句話總結來總結這幾個特性之間的關系,那就是“一致性是事務的最終目的,而原子性、隔離性、持久性其實都是為了實現一致性的手段”。
1、原子性(Atomicity)
概念:一個事務必須是一系列操作的最小單元,這系列操作的過程中,要么整個執行,要么整個回滾,不存在只執行了其中某一個或者某幾個步驟。
對應到上面的轉賬操作中,原子性就代表(檢查余額、轉賬、到賬)三個步驟就是一個整體,少了任何一個都不能稱為一次轉賬,整個過程中檢查余額、轉賬、到賬要么整體都執行,要么一個失敗就整體失敗,絕對不會出現某一個執行成功其它的都執行失敗,或者某一個執行失敗其它的操作執行成功的情況。
2、隔離性(Isolation)
概念:隔離性是說兩個事務的執行都是獨立隔離開來的,事務之前不會相互影響,多個事務操作一個對象時會以串行等待的方式保證事務相互之間是隔離的。
小明和小芳各自有一本作業本,如果他們同時去寫作業,這時他們都可以在各自作業本上寫作業是相互不影響的。但是如果他們兩個人只有一本作業本,但是他們都想去寫作業怎么辦,那么就這個時候就只能等一個人先寫完作業后,另外一個人才能寫,要不然兩個人同時在同一個作業本上寫作業,那么肯定會亂套。所以這種兩個事物操作同一個對象必須隔離開來不能相互影響的特性稱為事務的隔離性。
3、一致性(Consistency)
概念:事務要保證數據庫整體數據的完整性和業務的數據的一致性,事務成功提交整體數據修改,事務錯誤則回滾到數據回到原來的狀態;
如上面轉賬的案例,如果事務提交成功則A賬戶減金額,B賬戶則加對應的金額,數據庫總體金額不變只是載體變了。如果事務出錯則整體回滾,無論到了上面的哪個步驟A和B的數據都會回到最事務開啟前的狀態保證數據的始終一致;
4、持久性(Durability)
概念:持久性是指一旦事務成功提交后,只要修改的數據都會進行持久化,不會因為異常、宕機而造成數據錯誤或丟失。
轉載于:https://zhuanlan.zhihu.com/p/27789602
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的数据库 / 事务的 ACID的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: OS / 线程的 3 种实现方式(内核级
- 下一篇: 数据库 / 事务的隔离级别
