[數據庫事務與鎖]詳解一: 徹底理解數據庫事務
註明: 本文轉載自http://www.hollischuang.com/archives/898
事務
事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。在計算機術語中,事務通常就是指數據庫事務。
概念
一個數據庫事務通常包含對數據庫進行讀或寫的一個操作序列。它的存在包含有以下兩個目的:
1、為數據庫操作提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
2、當多個應用程序在並發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相幹擾。
當一個事務被提交給了DBMS(數據庫管理系統),則DBMS需要確保該事務中的所有操作都成功完成且其結果被永久保存在數據庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態(要麽全執行,要麽全都不執行);同時,該事務對數據庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行。
但在現實情況下,失敗的風險很高。在一個數據庫事務的執行過程中,有可能會遇上事務操作失敗、數據庫系統/操作系統失敗,甚至是存儲介質失敗等情況。這便需要DBMS對一個執行失敗的事務執行恢復操作,將其數據庫狀態恢復到一致狀態(數據的一致性得到保證的狀態)。為了實現將數據庫狀態恢復到一致狀態的功能,DBMS通常需要維護事務日誌以追蹤事務中所有影響數據庫數據的操作。
特性
並非任意的對數據庫的操作序列都是數據庫事務。事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
原子性(Atomicity):事務作為一個整體被執行,包含在其中的對數據庫的操作要麽全部被執行,要麽都不執行。
一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
隔離性(Isolation):多個事務並發執行時,一個事務的執行不應影響其他事務的執行。
持久性(Durability):一個事務一旦提交,他對數據庫的修改應該永久保存在數據庫中。
舉例
用一個常用的“A賬戶向B賬號匯錢”的例子來說明如何通過數據庫事務保證數據的準確性和完整性。熟悉關系型數據庫事務的都知道從帳號A到帳號B需要6個操作:
1、從A賬號中把余額讀出來(500)。
2、對A賬號做減法操作(500-100)。
3、把結果寫回A賬號中(400)。
4、從B賬號中把余額讀出來(500)。
5、對B賬號做加法操作(500+100)。
6、把結果寫回B賬號中(600)。
原子性:
保證1-6所有過程要麽都執行,要麽都不執行。一旦在執行某一步驟的過程中發生問題,就需要執行回滾操作。 假如執行到第五步的時候,B賬戶突然不可用(比如被註銷),那麽之前的所有操作都應該回滾到執行事務之前的狀態。
一致性
在轉賬之前,A和B的賬戶中共有500+500=1000元錢。在轉賬之後,A和B的賬戶中共有400+600=1000元。也就是說,數據的狀態在執行該事務操作之後從一個狀態改變到了另外一個狀態。同時一致性還能保證賬戶余額不會變成負數等。
隔離性
在A向B轉賬的整個過程中,只要事務還沒有提交(commit),查詢A賬戶和B賬戶的時候,兩個賬戶裏面的錢的數量都不會有變化。
如果在A給B轉賬的同時,有另外一個事務執行了C給B轉賬的操作,那麽當兩個事務都結束的時候,B賬戶裏面的錢應該是A轉給B的錢加上C轉給B的錢再加上自己原有的錢。
持久性
一旦轉賬成功(事務提交),兩個賬戶的裏面的錢就會真的發生變化(會把數據寫入數據庫做持久化保存)!
原子性與隔離行
一致性與原子性是密切相關的,原子性的破壞可能導致數據庫的不一致,數據的一致性問題並不都和原子性有關。
比如剛剛的例子,在第五步的時候,對B賬戶做加法時只加了50元。那麽該過程可以符合原子性,但是數據的一致性就出現了問題。
因此,事務的原子性與一致性缺一不可。
[數據庫事務與鎖]詳解一: 徹底理解數據庫事務