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