一.什么是事務
事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要么全部成功,要么一個都不做。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
二.事務的 ACID
事務具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱為 ACID 特性。
1 、原子性
事務是數據庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做
2 、一致性
事
務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處于一致性狀態。如果數據庫系統
運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處于一種不正確的狀態,或者說是
不一致的狀態。
3 、隔離性
一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它并發事務是隔離的,并發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
數據庫系統必須維護事務的以下特性 ( 簡稱 ACID) :
原子性 (Atomicity)
一致性 (Consistency)
隔離性 (Isolation)
持久性 (Durability)
原子性 (Atomicity)
事務中的所有操作要么全部執行,要么都不執行;
如果事務沒有原子性的保證,那么在發生系統
故障的情況下,數據庫就有可能處于不一致狀
態。
原子性 (Atomicity)
如果故障發生在 write(A) 和 read(B) 之間,則將有可能造成帳戶 A
的余額已經減去 50 元錢,而帳戶 B 的余額卻沒有改變,憑空就少了 50
元錢。值得注意的是,即使沒有故障發生,系統在某一時刻也會處于不一致狀態。原子性的要求就是這種不一致狀態除了在事務執行當中出現外,在其他任何時刻都
是不可見的。保證原子性是 DBMS 的責任:即事務管理器和恢復管理器的責任。
一致性 (Consistency)
主要強調的是,如果在執行事務之前數據庫是一致的,那么在執行事務之后數據庫也還是一
致的;所謂一致性簡單地說就是數據庫中數據的完整性,包括它們的正確性。對于圖中的事務
Ti 來說,一致性要求就是事務的執行不改變帳戶 A 和帳戶 B
的和。否則的話事務就會創造或銷毀錢!單個事務的一致性是由對該事務進行編鍵的應用程序員的責任,但是在某些情況下利用 DBMS 中完整性約束 (
如觸發器 ) 的自動檢查功能有助于一致性的維護。
隔離性 (Isolation)
即使多個事務并發(同時)執行,每個事務都感覺不到系統中有其他的事務在執行,因而也
就能保證數據庫的一致性;事情的起因 : 即使每個事務都能保持一致性和原子性,但如果幾個事務并發執行,且訪問相同的數據項,則它們的操作會以人們所不希望的某種方式交叉執行,結果導致不一致的狀態!訪問相同數據項的兩個事務并發執行
解決辦法 :
如果幾個事務要訪問相同的數據項,為了保證數據庫的一致性,可以讓這幾個事務:
① 串行執行:即一個接著一個地執行事務;
② 并發執行:即同時執行多個事務,但用并發控制機制來解決不同事務間的相互影響。隔離性的保證 :
事務的隔離性能夠確保事務并發執行后的系統狀態與這些事務按某種次序串行執行后的狀態是等價的。
保證隔離性也是 DBMS 的責任:即并發控制管理器的責任。
持久性 (Durability)
事務成功執行后它對數據庫的修改是永久的,即使系統出現故障也不受影響。
持久性的含義是說:一旦事務成功執行之后,它對數據庫的更新是永久的。可以用以下兩種
方式中的任何一種來達到持久性的目的:
以犧牲應用系統的性能為代價
以多占用磁盤空間為代價
以犧牲應用系統的性能為代價:要求事務對數據庫系統所做的更新在事務結束前已經寫入磁盤;以
多占用磁盤空間為代價:要求事務已經執行的和已寫到磁盤的、對數據庫進行更新的信息是充分的(例如,數據庫日志的信息就足夠的多),使得 DBMS
在系統出現故障后重新啟動系統時,能夠 ( 根據日志 ) 重新構造更新。保證持久性也是 DBMS 的責任:即恢復
管理器的責任。
事物的狀態有如下幾種:
⑴ 中止事務:執行中發生故障、不能執行完成的
事務;
⑵ 事務回滾:將中止事務對數據庫的更新撤消
掉;
⑶ 已提交事務:成功執行完成的事務。
系統的恢復步驟是:
1 、反向掃描文件日志(即從最后向前掃描日志文件),查找該事務
的更新操作。
2 、對該事務的更新操作執行逆操作。即將日志記錄 “ 更新前的值 ” 寫
入數據庫。這樣,如果記錄中是插入操作,則相當于做刪除操
作;若記錄中是刪除操作,則做插入操作;若是修改操作,則相
當于用修改前的值代替修改后的值。
3 、繼續反向掃描日志文件,查找該事務的其他更新操作,并做和 2
一樣的同樣處理。
4 、如此處理下去,直至讀到此事務的開始標記,事務的故障恢復就
完成了。
事務的隔離級別
隔離級別定義了事務與事務之間的隔離程度。
隔離級別與并發性是互為矛盾的:隔離程度越高,數據庫的并發性越差;隔離程度越低,數
據庫的并發性越好。
ANSI/ISO SQL92 標準定義了一些數據庫操作的隔離級別
未提交讀( read uncommitted )
提交讀( read committed )
重復讀( repeatable read )
串行讀( serializable )
隔離級別的效果更新丟失( lost update ):當系統允許兩個事務同時更新同一數據是,發生更新丟失。臟讀( dirty read ):當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。
不可重復讀取( nonrepeatableread ):同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生不可重復讀取。
幻像( phantom read ):同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻像讀。