數據庫系統必須維護事務的以下特性(簡稱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):同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操作,每次返回
不同的結果集,此時發生幻像讀。