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