徹底理解數據庫事務

事務

事務(Transaction),是用戶定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。例如,在關係數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。

事務和程序是兩個概念。一般地講,一個程序中包含多個事務。

事務的開始和結束可以由用戶顯式控制。如果用戶沒有顯式地定義事務,則由數據庫管理系統按照默認規定自動劃分事務。

事務的特性

事務具有4個特性,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)持續性\永久性(Durability ),這四個特性簡稱爲ACID特性(ACID properties)。

原子性(Atomicity):事務是數據庫的羅技工作單位,事務中包括的操作要麼都做,要麼都不做。
一致性(Consistency):事務應確保數據庫的狀態從一個一致性狀態轉變爲另一個一致性狀態。一致性是通過原子性來保證的。
隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。
持久性(Durability):一個事務一旦提交,他對數據庫的修改應該永久保存在數據庫中。接下來的其他操作或故障不應該對其執行結果有任何影響。

事務是恢復和併發控制的基本單位。保證事務ACID特性是事務管理的重要任務。事務的ACID可能遭到破壞的因素有:

(1)多個事務並行運行時,不同事務的操作交叉執行;

(2)事務在運行過程中被強行終止。

數據庫管理系統中恢復機制併發控制機制的責任就是保證事務免受上述兩個因素的影響。

舉例

用一個常用的“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元。那麼該過程可以符合原子性,但是數據的一致性就出現了問題。

因此,事務的原子性與一致性缺一不可。

My SQL事務控制語言(TCL)

當一個事務執行並完成修改時,並不是對目標表立即進行修改,此時修改的結果只是保存到臨時緩存中,只有利用事務控制命令才最終認可這個事務。

控制事務的命令有3個: 
COMMIT; 
ROLLBACK; 
SAVEPOINT.

1. COMMIT命令 
COMMIT 命令用於把事務所做的修改保存到數據庫,表面該事務對數據庫所做的操作將永久記錄到數據庫。

如:刪除表裏所有價格低於$14的產品

DELETE FROM PRODUCT_TMP WHERE cost < 14; 
COMMIT;              /*使用COMMIT語句把修改保存到數據庫,完成這個事務*/

2. ROLLBACK 命令 
ROLLBACK 命令用於撤銷還沒有被保存到(未提交的事務)數據庫的命令,它只能用於撤銷上一個COMMIT或ROLLBACK命令之後的事務。

3. SAVEPOINT命令 
保存點是事務過程中的一個邏輯點,我們可以把事務回退到這個點,而不必回退整個事務。

SAVEPOINT savepoint_name;     /*在事務語句中間創建一個保存點*/

4. ROLLBACK TO SAVEPOINT命令 
回退到保存點的命令:

ROLLBACK TO SAVEPOINT_NAME;

5.RELEASE SAVEPOINT 命令

用於刪除創建的保存點,在某個保存點被釋放之後,就不能再利用ROLLBACK命令來撤銷這個保存點之後的事務操作了。

例:對scott.emp表綜合使用COMMIT、ROLLBACK和SAVEPOINT示例。 
(1)更新scott.emp表中的sal字段,然後執行ROLLBACK操作。

UPDATE scott.emp SET sal=sal*2; /*已更新*/
ROLLBACK; /*回退已完成。(表示UPDATE語句並沒有執行)*/

(2)更新scott.emp表中的sal字段,然後執行COMMIT操作。

UPDATE scott.emp SET sal=sal*2;     /*已更新*/ 
COMMIT;     /*提交完成。 (表示UPDATE真正提交到數據庫)*/

(3)向表中插入員工編號爲1111的記錄,設置一個保存點,然後用UPDATE命令將該記錄的員工姓名修改爲李明,然後用ROLLBACK命令回滾到保存點。


INSERT INTO scott.emp(empno) VALUES (1111);      /*已插入一行*/
SAVEPOINT p1;     /*設置保存點p1*/ 
UPDATE scott.emp SET ename=”李明” WHERE empno=1111; 
ROLLBACK TO p1;     /*回退已完成。*/

事務控制與數據庫性能 

當出現COMMIT命令時,回退事務信息被寫入到目標表裏,臨時存儲區域裏的回退信息被清除; 
當出現ROLLBACK命令時,修改不會作用於數據庫,而臨時存儲區域裏的回退信息被清除; 
如果一直沒有出現COMMIT 或 ROLLBACK 命令,臨時存儲區域裏的回退信息就會不斷增長,直至沒有剩餘空間,導致數據庫停止全部進程,直至空間被釋放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章