在數(shù)據(jù)庫系統(tǒng)中,“事務(wù)”是訪問數(shù)據(jù)庫并可能更新各種數(shù)據(jù)項的一個程序執(zhí)行單元。為了保證數(shù)據(jù)完整性,要求數(shù)據(jù)庫系統(tǒng)維護事務(wù)的原子性、一致性、隔離性和持久性。針對事務(wù)的這 4 種特性,考慮以下的架構(gòu)設(shè)計場景:
一、場景描述
假設(shè)在某一個時刻只有一個活動的事務(wù),為了保證事務(wù)的原子性數(shù)據(jù)庫中的事務(wù)是什么,對于要執(zhí)行寫操作的數(shù)據(jù)項,數(shù)據(jù)庫系統(tǒng)在磁盤上維護數(shù)據(jù)庫的一個副本數(shù)據(jù)庫中的事務(wù)是什么,所有的寫操作都在數(shù)據(jù)庫副本上執(zhí)行,而保持原始數(shù)據(jù)庫不變,如果在任一時刻操作不得不中止,系統(tǒng)僅需要刪除副本,原數(shù)據(jù)庫沒有受到任何影響。這種設(shè)計策略稱為影子拷貝。
事務(wù)的一致性要求在沒有其它事務(wù)并發(fā)執(zhí)行的情況下,事務(wù)的執(zhí)行應(yīng)該保證數(shù)據(jù)庫的一致性。數(shù)據(jù)庫系統(tǒng)通常采用完整性約束檢查機制保證單個事務(wù)的一致性。
事務(wù)的隔離性保證操作并發(fā)執(zhí)行后的系統(tǒng)狀態(tài)與這些操作以某種次序順序執(zhí)行(即可串行化執(zhí)行)后的狀態(tài)是等價的。兩階段鎖協(xié)議是實現(xiàn)隔離性的常見方案,該協(xié)議能夠保證事務(wù)的可串行化執(zhí)行,可能發(fā)生死鎖。
持久性保證一旦事務(wù)完成,該事務(wù)對數(shù)據(jù)庫所做的所有更新都是永久的,如果事務(wù)完成后系統(tǒng)出現(xiàn)故障,則需要通過恢復(fù)機制保證事務(wù)的持久性。假設(shè)在日志中記錄所有對數(shù)據(jù)庫的修改操作,將一個事務(wù)的所有寫操作延遲到事務(wù)提交后才執(zhí)行,則在日志中無需記錄數(shù)據(jù)項被事務(wù)修改前的原始值,當(dāng)系統(tǒng)發(fā)生故障時,如果某個事務(wù)已經(jīng)開始,但沒有提交,則該事務(wù)應(yīng)該什么都不做。
二、場景解析:
第 1 個架構(gòu)設(shè)計場景描述了數(shù)據(jù)庫設(shè)計中為了實現(xiàn)原子性和持久性的最為簡單的策略:“影子拷貝”。該”。該策略假設(shè)在某一個時刻只有一個活動的事務(wù),首先對數(shù)據(jù)庫做副本(稱為影子副本),并在磁盤上維護一個 指針,指向數(shù)據(jù)庫的當(dāng)前副本。對于要執(zhí)行寫操作的數(shù)據(jù)項,數(shù)據(jù)庫系統(tǒng)在磁盤上維護數(shù)據(jù)庫的一個副本,所有的寫操作都在數(shù)據(jù)庫副本上執(zhí)行,而保持原始數(shù)據(jù)庫不變,如果在任一時刻操作不得不中止,系統(tǒng)僅需要刪除新副本,原數(shù)據(jù)庫副本沒有受到任何影響。
第 2 個架構(gòu)設(shè)計場景,事務(wù)的一致性要求在沒有其它事務(wù)并發(fā)執(zhí)行的情況下,事務(wù)的執(zhí)行應(yīng)該保證數(shù)據(jù)庫的一致性。數(shù)據(jù)庫系統(tǒng)通常采用完整性約束檢查機制保證單個事務(wù)的一致性。
第 3 個架構(gòu)設(shè)計場景主要考查數(shù)據(jù)庫的鎖協(xié)議。兩階段鎖協(xié)議是實現(xiàn)事務(wù)隔離性的常見方案,該協(xié)議通過定義鎖的增長和收縮兩個階段約束事務(wù)的加鎖和解鎖過程,能夠保證事務(wù)的串行化執(zhí)行,但由于事務(wù)不能一次得到所有需要的鎖,因此該協(xié)議會可能會導(dǎo)致死鎖。
第 4 個架構(gòu)設(shè)計場景主要考查數(shù)據(jù)庫的恢復(fù)機制,主要描述了基于日志的延遲修改技術(shù)(- )的設(shè)計與恢復(fù)過程。該技術(shù)通過在日志中記錄所有對數(shù)據(jù)庫的修改操作,將一個事務(wù)的所有寫操作延遲到事務(wù)提交后才執(zhí)行,日志中需要記錄“事務(wù)開始”和“事務(wù)提交”時間,還需要記錄數(shù)據(jù)項被事務(wù)修改后的新值,無需記錄數(shù)據(jù)項被事務(wù)修改前的原始值。當(dāng)系統(tǒng)發(fā)生故障時,如果某個事務(wù)已經(jīng)開始,但沒有提交,則該事務(wù)對數(shù)據(jù)項的修改尚未體現(xiàn)在數(shù)據(jù)庫中,因此無需做任何恢復(fù)動作。