數(shù)據(jù)庫中事務(wù)處理的設(shè)計(jì)_第1頁
數(shù)據(jù)庫中事務(wù)處理的設(shè)計(jì)_第2頁
數(shù)據(jù)庫中事務(wù)處理的設(shè)計(jì)_第3頁
數(shù)據(jù)庫中事務(wù)處理的設(shè)計(jì)_第4頁
數(shù)據(jù)庫中事務(wù)處理的設(shè)計(jì)_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 本科畢業(yè)(設(shè)計(jì))論文(二五)屆題目:數(shù)據(jù)庫事務(wù)處理的設(shè)計(jì)分院系部 計(jì)算機(jī)與信息科學(xué)系 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué)生姓名 導(dǎo)師姓名 導(dǎo)師職稱 講 師 副 教 授 二五年六月一日數(shù)據(jù)庫事務(wù)處理的設(shè)計(jì) 摘要:本文主要介紹了關(guān)系數(shù)據(jù)庫系統(tǒng)事務(wù)處理的基本設(shè)計(jì)思想,并介紹事務(wù)處理系統(tǒng)中各組件的基本功能和核心服務(wù)。以此為基礎(chǔ)設(shè)計(jì)了一個(gè)簡單的事務(wù)處理系統(tǒng)模型,對部分細(xì)節(jié)進(jìn)行了詳細(xì)設(shè)計(jì)。關(guān)鍵字:事務(wù);事務(wù)處理;事務(wù)模型The Design of Transaction Processing in Database Abstract This article mainly introduced relatio

2、nal database system transaction processes the basic design thought, and introduction transaction processes in the system various modules basic function and the core service. Designed a simple transaction take this as the foundation to process the system model, has carried on the detailed design to t

3、he partial details.Keywords Transaction; Transaction Processing; Transaction Processing Model目 錄前言11數(shù)據(jù)庫中的事務(wù)處理11.1研究的意義11.2研究的背景及目的12事務(wù)22.1事務(wù)的概念與其特性22.2事務(wù)的必要性22.3事務(wù)的模型3扁平事務(wù)3帶保存點(diǎn)的扁平事務(wù)3鏈?zhǔn)聞?wù)3嵌套事務(wù)3分布事務(wù)4長事務(wù)4多級(jí)別事務(wù)42.4事務(wù)處理系統(tǒng)的定義53事務(wù)處理系統(tǒng)的各模塊的核心服務(wù)和功能63.1一個(gè)事務(wù)的執(zhí)行過程63.2事務(wù)處理系統(tǒng)重要組件必要功能的說明7事務(wù)處理監(jiān)控器的服務(wù)7日志管理器的功能說明9鎖管理器的

4、功能說明9事務(wù)管理器的功能說明104設(shè)計(jì)與實(shí)現(xiàn)104.1事務(wù)處理的簡單模型104.2具體的設(shè)計(jì)與細(xì)節(jié)12事務(wù)標(biāo)識(shí)符的設(shè)計(jì)12事務(wù)處理監(jiān)控器的設(shè)計(jì)13日志管理器的設(shè)計(jì)13鎖管理器的設(shè)計(jì)16事務(wù)管理器的設(shè)計(jì)165結(jié)論21前言事務(wù)處理的發(fā)展已經(jīng)有了上千年的歷史了。從5000年前的殷人開始使用烏龜?shù)耐鈿び浭乱詠恚呀?jīng)經(jīng)過了幾千年的歷史了。20世紀(jì)后半葉在事務(wù)處理方面出現(xiàn)了兩個(gè)主要的發(fā)展:基于磁性存儲(chǔ)介質(zhì)(磁帶和磁盤)的成批事務(wù)處理以及基于電子存儲(chǔ)和計(jì)算機(jī)網(wǎng)絡(luò)的聯(lián)機(jī)事務(wù)處理。在數(shù)據(jù)庫管理系統(tǒng)中附加上事務(wù)處理子系統(tǒng)會(huì)使系統(tǒng)有更好的可靠性。1數(shù)據(jù)庫中的事務(wù)處理1.1研究的意義在修改數(shù)據(jù)庫中的數(shù)據(jù)時(shí),要使它里

5、面的數(shù)據(jù)正確一致的被更新,這是事務(wù)處理的工作。當(dāng)數(shù)據(jù)庫系統(tǒng)出現(xiàn)更新故障時(shí),為了將損失減少到最低,一般來使用事務(wù)處理來恢復(fù)數(shù)據(jù)。事務(wù)處理的發(fā)展已經(jīng)很久了,其理論和技術(shù)相對來說是比較成熟的。1.2研究的背景及目的國外的數(shù)據(jù)庫經(jīng)過幾十年的發(fā)展,現(xiàn)在幾乎壟斷了整個(gè)市場。數(shù)據(jù)庫技術(shù)是整個(gè)信息產(chǎn)業(yè)的核心。即使數(shù)據(jù)庫的存儲(chǔ)介質(zhì)發(fā)生了改變,數(shù)據(jù)庫的概念并不會(huì)有所變化。中國已經(jīng)有四家企業(yè)開發(fā)了自己的數(shù)據(jù)庫(不包括臺(tái)灣省)。這些數(shù)據(jù)庫基本能夠勝任中等強(qiáng)度與規(guī)模的數(shù)據(jù)庫系統(tǒng)應(yīng)用。對于那些核心業(yè)務(wù)應(yīng)用,國產(chǎn)數(shù)據(jù)庫的應(yīng)用案例十分有限。同時(shí)在對圖形工具的支持方面,國際主流數(shù)據(jù)庫管理系統(tǒng)提供好的圖形管理工具,而且還提供豐富

6、的應(yīng)用構(gòu)件和套件,比如應(yīng)用服務(wù)器、系統(tǒng)調(diào)優(yōu)與分析工具、企業(yè)應(yīng)用套件等。國產(chǎn)數(shù)據(jù)庫的要趕上國外的數(shù)據(jù)庫,還要很長時(shí)間。研究的目的是:通過對事務(wù)處理的研究設(shè)計(jì)出數(shù)據(jù)庫所需要的事務(wù)處理系統(tǒng)。2事務(wù)2.1事務(wù)的概念與其特性事務(wù)是對物理和抽象的應(yīng)用狀態(tài)上的操作集合。事務(wù)作為單個(gè)邏輯工作單元執(zhí)行一系列操作。一個(gè)邏輯工作單元必須有四個(gè)屬性,稱為ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個(gè)事務(wù)。保證數(shù)據(jù)一致性的關(guān)鍵是要明確數(shù)據(jù)訪問和更新的序列。這一序列稱為事務(wù)。它是并發(fā)和恢復(fù)的基本單位。下面分別對事務(wù)的四個(gè)特性進(jìn)行敘述:原子性:一個(gè)事務(wù)對狀態(tài)的改變是原子的。要么都發(fā)生,要么都不發(fā)生。原

7、子性是從操作調(diào)用者的角度來定義,因?yàn)閹缀鯖]有任何原子操作(包括機(jī)器指令)在所有的實(shí)現(xiàn)層次上保持真正的原子性。一致性:一個(gè)事務(wù)是對狀態(tài)的一個(gè)正確改變。作為一組操作沒有違反任何與狀態(tài)相關(guān)的完整性約束。這要求事務(wù)是一個(gè)正確的程序。隔離性:盡管事務(wù)是并發(fā)執(zhí)行的,但看起來是單個(gè)執(zhí)行的,即對于一個(gè)事務(wù)T,任何其他事務(wù)要么在T之前執(zhí)行,要么在T之后執(zhí)行,但不會(huì)既在T之前,又在T之后執(zhí)行。持久性:一旦一個(gè)事務(wù)成功完成(提交),它對狀態(tài)的改變不會(huì)受到其他失敗事務(wù)的影響。2.2事務(wù)的必要性事務(wù)是為了實(shí)現(xiàn)軟件容錯(cuò)的?,F(xiàn)在沒有一直都能運(yùn)行而不出錯(cuò)的軟件,當(dāng)一個(gè)產(chǎn)品化的計(jì)算機(jī)系統(tǒng)由于軟件問題崩潰,它的使用者并不會(huì)等到軟

8、件開發(fā)者來將此問題更正之后,才使用它,而是重啟系統(tǒng),希望這它下一次能運(yùn)行起來,原因是因?yàn)樗吘棺蛱毂皇褂眠^。而系統(tǒng)通過用事務(wù),系統(tǒng)恢復(fù)到最近的一個(gè)狀態(tài)。軟件故障是系統(tǒng)失敗的主要來源,因?yàn)槠渌布系墓收隙际潜卉浖帘蔚舻?。軟件故障是一個(gè)沒有解決的問題。軟件容錯(cuò)主要有兩種方法:N版本程序設(shè)計(jì)和事務(wù)。兩種方法一般可結(jié)合起來使用。數(shù)據(jù)庫是用來管理大量數(shù)據(jù)的,它肯定會(huì)存在軟件上的故障,此時(shí)只能是通過事務(wù)來使它內(nèi)部的數(shù)據(jù)不會(huì)因?yàn)檐浖收隙蝗科茐牡?。用N版本程序設(shè)計(jì),它的實(shí)現(xiàn)和維護(hù)是昂貴的。這是因?yàn)橐玫秸即蠖鄶?shù)的結(jié)果,N至少是3。2.3事務(wù)的模型2.3.1扁平事務(wù)該模型是所有事務(wù)類型中最簡單的一種。

9、扁平事務(wù)中的所有操作是處于同一平面的,由一個(gè)Begin_Work()來標(biāo)志開始,Commit_Work結(jié)束。這個(gè)原因使這種事務(wù)在執(zhí)行之后的結(jié)果只有兩種,除此之外沒有其它的結(jié)果。一是全做,二是全不做。對于后者來說,原因有兩個(gè):一是事務(wù)放棄,一是外界的事件使其不能完成。因此它具有“要么全做,要么全不做”的特性。2.3.2帶保存點(diǎn)的扁平事務(wù)系統(tǒng)在執(zhí)行過程出錯(cuò)了,但是在一些情況下并不是所有的操作都無效的,如果使用前面的扁平事務(wù),所有的操作都將回滾,這樣做帶來的結(jié)果是,一些不需要回滾的操作也被回滾了,代價(jià)也較大。如果是回到同一事務(wù)里面的較早狀態(tài),就能較好的支持了這類應(yīng)用。所以在這種模型中設(shè)置保存點(diǎn)。2.

10、3.3鏈?zhǔn)聞?wù)鏈?zhǔn)聞?wù)是保存點(diǎn)模式的一種變種。由前一個(gè)事務(wù)來觸發(fā)后一個(gè)事務(wù)發(fā)生。2.3.4嵌套事務(wù)嵌套事務(wù)的定義有五點(diǎn):1)嵌套事務(wù)是若干事務(wù)組成的一棵樹,子樹既可以是嵌套的,也可以是扁平事務(wù)。2)處在葉節(jié)點(diǎn)的事務(wù)是扁平事務(wù)。從根節(jié)點(diǎn)到葉節(jié)點(diǎn)通過的路徑不同所經(jīng)過的距離也是不同的。3)位于要節(jié)點(diǎn)的事務(wù)稱為頂層事務(wù),其他的事務(wù)稱為子事務(wù)。事務(wù)的前驅(qū)被稱為父(事務(wù)),事務(wù)的后繼被稱為子(事務(wù))。4)子事務(wù)既可以提交,也可以回滾。直到父事務(wù)提交后,子事務(wù)的提交才會(huì)生效。所以,任何子事務(wù)只有在根事務(wù)提交后才能最終提交。5)樹中的任意一個(gè)事務(wù)的回滾會(huì)引起它的所有子事務(wù)一同回滾。正是因?yàn)檫@一點(diǎn),子事務(wù)僅保留了A

11、、C、I特性,而不具有D特性。2.3.5分布事務(wù)分布事務(wù)一般是扁平事務(wù),它應(yīng)用于分布環(huán)境下,因此必須根據(jù)數(shù)據(jù)的位置來訪問網(wǎng)絡(luò)中的節(jié)點(diǎn)。2.3.6長事務(wù)以上所有介紹的事務(wù)模型都存在一個(gè)問題,一個(gè)比較大的批事務(wù)在前面幾個(gè)事務(wù)模型里不能完美的解決掉。解決這個(gè)典型問題的方法一般是由執(zhí)行一系列更新少量數(shù)據(jù)的事務(wù)構(gòu)成,整個(gè)事務(wù)的原子性通過在數(shù)據(jù)庫中的事務(wù)上下文數(shù)據(jù)來維持。上下文是空集的程序被稱為上下文無關(guān),其他的被稱為上下文相關(guān)。影響了數(shù)據(jù)庫的上下文的原因是因?yàn)槠渌氖聞?wù)更新了數(shù)據(jù)庫。2.3.7多級(jí)別事務(wù)Tselectinsertupdateselect插入元組插入B樹項(xiàng)更新頁插入地址表項(xiàng)定位插入項(xiàng)圖1一

12、個(gè)多級(jí)別事務(wù)的模型圖多級(jí)別事務(wù)是嵌套事務(wù)的一般化和更自由化的版本。它們允許了子事務(wù)先提交,這使單獨(dú)回滾子事務(wù)的修改是可能的。然而為了保證事務(wù)的四個(gè)特性。最終會(huì)假設(shè)存在一個(gè)補(bǔ)償事務(wù),如果父事務(wù)決定(或被迫)回滾,補(bǔ)償事務(wù)就可以取消子事務(wù)已經(jīng)完成的。的補(bǔ)償事務(wù)可以是另外的嵌套事務(wù)和多級(jí)事務(wù)。因?yàn)檫@些補(bǔ)償事務(wù)可以在所有嵌套層次被執(zhí)行,這樣就保證了所有的更新都可以被撤消,即使是在根節(jié)點(diǎn)失敗之前所有子事務(wù)已經(jīng)提交了的操作。因?yàn)檫@種模型使層次化對象實(shí)現(xiàn)模式允許通過隔離高層對象來保護(hù)較低層次上的修改,所以它具有所有的ACID特性。這樣實(shí)現(xiàn)了對根事務(wù)的隔離,因此使原子地執(zhí)行根事務(wù)成為可能。在數(shù)據(jù)庫系統(tǒng)限制的情

13、況下,這種多級(jí)別事務(wù)足夠用了。雖然回滾時(shí),執(zhí)行補(bǔ)償操作的代價(jià)要比僅僅存儲(chǔ)舊值昂貴,但是回滾并不是一個(gè)頻繁的操作,擁有更小的提交控制單元的好處就會(huì)遠(yuǎn)遠(yuǎn)超過補(bǔ)償?shù)拇鷥r(jià)。2.4事務(wù)處理系統(tǒng)的定義從不同的角度來認(rèn)識(shí)事務(wù)處理系統(tǒng),因?yàn)槊恳粋€(gè)角度看到的系統(tǒng)都是很不同的,很難對事務(wù)處理系統(tǒng)做一個(gè)定義。給出一個(gè)綜合的定義是:事務(wù)處理系統(tǒng)提供工具使廣泛應(yīng)用的編程、執(zhí)行和管理更加容易或者自動(dòng)化。事務(wù)處理應(yīng)用一般都支持多個(gè)設(shè)備組成的網(wǎng)絡(luò),這些設(shè)備可以把查詢和更新請求提交給應(yīng)用。在這些輸入的基礎(chǔ)上,應(yīng)用維護(hù)著一些表示現(xiàn)實(shí)世界特定狀態(tài)的數(shù)據(jù)庫。應(yīng)用研究的響應(yīng)和輸出總是驅(qū)使著現(xiàn)實(shí)世界的傳動(dòng)器和轉(zhuǎn)換器,而它們改變和控制著這

14、些狀態(tài)。3事務(wù)處理系統(tǒng)的各模塊的核心服務(wù)和功能首先來看一下,一個(gè)事務(wù)的執(zhí)行過程:3.1一個(gè)事務(wù)的執(zhí)行過程 圖2事務(wù)執(zhí)行過程中的核心服務(wù)當(dāng)一個(gè)事務(wù)發(fā)出了Begin_Work()命令時(shí),將在事務(wù)管理器中注冊該事務(wù)并產(chǎn)生一個(gè)唯一的事務(wù)標(biāo)識(shí)符。一個(gè)應(yīng)用一旦開始了一個(gè)事務(wù),它就可以開始調(diào)用數(shù)據(jù)庫,并且把請求發(fā)送給本地和遠(yuǎn)程服務(wù)。當(dāng)一個(gè)資源管理器得到該事務(wù)的第一個(gè)請求時(shí),它就加入到事務(wù)中,告知本地的事務(wù)管理器它想?yún)⑴c此事務(wù)的提交和回滾。參與一個(gè)事務(wù)的資源管理器通常有多個(gè)。由于這些資源管理器代表著事務(wù)執(zhí)行操作,所以它們把自已對對象所做的改變都記下來。作為一個(gè)規(guī)則,資源管理器記錄新舊對象值。事務(wù)處理系統(tǒng)提供了

15、一個(gè)日志服務(wù)記錄這些改變。日志管理器有效地實(shí)施了一個(gè)順序文件,里面記錄了事務(wù)對對象的所有更新。當(dāng)然,其他的資源管理器要告訴日志管理器這些更新是什么。為了提供隔離,資源管理器將封鎖事務(wù)存取的對象;這防止了其他事務(wù)看到本事務(wù)沒有提交的更新,也防止它們更改該未提交的事務(wù)所讀寫的數(shù)據(jù)。事務(wù)處理系統(tǒng)提供了一個(gè)封鎖管理器供其他資源管理器使用。當(dāng)事務(wù)發(fā)出Commit_Work()命令時(shí),事務(wù)管理器將執(zhí)行兩階段提交協(xié)議。首先它查詢所有參與該事務(wù)的資源管理器,問它們是否認(rèn)為該事務(wù)是一個(gè)一致的和完整的轉(zhuǎn)變。當(dāng)任一個(gè)資源管理器加以否決時(shí),提交就失敗了。但是如果所有的資源管理器都贊同,事務(wù)管理器將在日志中記錄下這個(gè)事

16、實(shí),通知每一個(gè)資源管理器事務(wù)是完整的。這時(shí),資源管理器才可以放鎖,執(zhí)行一些其他的完成該事務(wù)所需的操作。如果事務(wù)在執(zhí)行中出錯(cuò)了,或者有一個(gè)資源管理器在兩階段提交的第一個(gè)階段否決,那么事務(wù)管理器就要指揮這個(gè)事務(wù)回滾。這種情況下,事務(wù)管理器讀事務(wù)日志,對每一個(gè)日志記錄調(diào)用寫該記錄的資源管理理,讓其撤消操作。一旦所有撤消都完成以后,事務(wù)管理器調(diào)用每一個(gè)參與該事務(wù)的資源管理器,告知它們事務(wù)被終止了。遠(yuǎn)程調(diào)用事務(wù)的過程是本地先要對調(diào)用處理,找到調(diào)用的種類和調(diào)用的目的。如果調(diào)用 的不是本地的,通過通信管理器向另一端發(fā)送消息。接收到另外一個(gè)節(jié)點(diǎn)的TPRC(遠(yuǎn)程事務(wù)處理)到達(dá)的時(shí)候,就將它傳送給一個(gè)本地進(jìn)程。在

17、正確的處理完畢之后返回結(jié)果。3.2事務(wù)處理系統(tǒng)重要組件必要功能的說明由前面的圖1可以知道一個(gè)典型的事務(wù)處理系統(tǒng)至少應(yīng)該具有四個(gè)部分:事務(wù)處理監(jiān)控器、事務(wù)管理器、日志管理器、鎖管理器。下面是各個(gè)部分的核心的服務(wù)和功能:。3.2.1事務(wù)處理監(jiān)控器的服務(wù)事務(wù)處理監(jiān)控器是為了引入事務(wù)型完程過程調(diào)用(TPRC)。事務(wù)處理監(jiān)控器其實(shí)是一個(gè)管理其他資源管理器和處理器資源(比如,進(jìn)程、線程、訪問權(quán)限、程序、上下文等)的資源管理器。TP監(jiān)控器在這個(gè)意義上說很像一個(gè)操作系統(tǒng),但是還好跟操作系統(tǒng)有很大不同,通常來說操作系統(tǒng)根據(jù)一個(gè)長期的基準(zhǔn)給請求分配資源,而TP監(jiān)控器必須根據(jù)每個(gè)請求的分配資源。其次在每創(chuàng)建一個(gè)會(huì)話

18、時(shí),操作系統(tǒng)所帶的所有管理任務(wù)必須在每個(gè)請求上由TP監(jiān)控器執(zhí)行。最后TP監(jiān)控器在崩潰之后進(jìn)行重啟時(shí),必須支持所有的應(yīng)用程序和所有的資源管理器,操作系統(tǒng)通常只要關(guān)心自己的系統(tǒng)文件。它的基本功能為:1)調(diào)度 從客戶端來的請求必須放到實(shí)現(xiàn)應(yīng)用服務(wù)的服務(wù)器程序中。并且正確的執(zhí)行完畢,回滾也是屬于正確的執(zhí)行完畢。因?yàn)榛貪L并沒有破壞系統(tǒng)的一致性。它首先確定處理請求的服務(wù)。若服務(wù)是遠(yuǎn)程的,那么請求將通RPC發(fā)送到那兒。若服務(wù)位于本地,檢查是否有一個(gè)為其服務(wù)的服務(wù)器已啟動(dòng)??鄾]有,調(diào)用負(fù)載平衡的組件來決定是為其建立一個(gè)新的服務(wù)器,還是請求應(yīng)該等到下一個(gè)服務(wù)器可用。最終,調(diào)度器將請法度發(fā)給服務(wù)器。2)服務(wù)器類管

19、理 TP監(jiān)控器負(fù)責(zé)啟動(dòng)服務(wù)器類,負(fù)責(zé)負(fù)載平等和所有相關(guān)的任務(wù)。在這里它負(fù)責(zé)的是啟動(dòng)數(shù)據(jù)庫的服務(wù)器及其它重要的事務(wù)資源管理器。要確保對于每個(gè)應(yīng)用程序,有一個(gè)服務(wù)器類被建立和處于激活狀態(tài)。3)認(rèn)證和授權(quán) 在執(zhí)行請求服務(wù)前,TP監(jiān)控器必須了解請求。用戶并沒有登錄到了操作系統(tǒng),只是注冊到了TP監(jiān)控器。但是,因?yàn)椴僮飨到y(tǒng)并不經(jīng)常執(zhí)行授權(quán)動(dòng)作,因而TP監(jiān)控器不得不對每個(gè)請求進(jìn)行授權(quán),它主要是基于如事務(wù)程序名、遠(yuǎn)程主機(jī)名、時(shí)間等一系列參數(shù)的原則。所有這些都在請求時(shí)根據(jù)用戶配置文件進(jìn)行檢查。4)資源管理 TP監(jiān)控器負(fù)責(zé)管理終端、數(shù)據(jù)庫、用戶和所有事務(wù)處理系統(tǒng)中的其他組件。它們的信息被保存在系統(tǒng)中心庫中,然而應(yīng)

20、用訪問中心庫的唯一方式是通過TP監(jiān)控器的管理接口來進(jìn)行。定義了應(yīng)用程序和其要交互的設(shè)備間的接口?,F(xiàn)實(shí)的做法是,有一組資源管理器實(shí)現(xiàn)各種表示對象,通過事務(wù)RPC向TP監(jiān)控器提供接口來表示服務(wù)。5)系統(tǒng)操作 TP監(jiān)控器必須向操作者提供足夠的信息來調(diào)整系統(tǒng),在普通操作過程中產(chǎn)生問題(終端斷開、服務(wù)器類的問題和其他很多的情況)時(shí)通知他們。6)恢復(fù) 系統(tǒng)崩潰后,TP監(jiān)控器負(fù)責(zé)重建進(jìn)程配置。7)隊(duì)列管理 支持隊(duì)列事務(wù)處理。隊(duì)列的主要功能是接受請求并將其傳給相應(yīng)的服務(wù)器,接受響應(yīng)結(jié)果并將其發(fā)送給相應(yīng)客戶機(jī)。當(dāng)且僅客戶事務(wù)提交請求時(shí),請求被放在一個(gè)請求隊(duì)列中。一旦一個(gè)請求位于請求隊(duì)列中時(shí),它將很快得到執(zhí)行。僅

21、當(dāng)服務(wù)器事務(wù)提交時(shí)結(jié)果才放到響應(yīng)隊(duì)列中。隊(duì)列中的每個(gè)響應(yīng)結(jié)果將由通過TP監(jiān)控器被發(fā)送給客戶端。根據(jù)不同的應(yīng)用和消息的不同內(nèi)容,要求有不同的發(fā)送保證(要和事務(wù)的ACID特性一致)。8)上下文管理 是一個(gè)TP監(jiān)控器服務(wù),它能用于所有的事務(wù)程序。它包括兩個(gè)功能:第一個(gè)功能是保存處理上下文,第二個(gè)功能和正在運(yùn)行的事務(wù)的上下文有關(guān)。3.2.2日志管理器的功能說明日志管理器是從資源管理的角度來描述的,而日志管理程序是從程序角度來描述的。在實(shí)質(zhì)上的理解應(yīng)該是一樣的,沒有分別的。首先要說明一下為什么需要日志管理程序,日志本身的設(shè)計(jì)實(shí)際上是一個(gè)順序存取類型的SQL表,然而在寫日志方面由于具有以下特殊的性質(zhì),日志

22、管理器的設(shè)置就成為了必要。1)封裝性 日志管理器對日志記錄頭的封裝只是為了確保正確地填寫這些頭字段信息。日志管理器為其他資源管理器提供接口,用以寫日志記錄體的內(nèi)容,而日志頭是日志管理器私有的。2)啟動(dòng) 系統(tǒng)重啟時(shí),日志管理器用于重構(gòu)那些永久的系統(tǒng)狀態(tài)。3)謹(jǐn)慎寫 日志通常是雙工的,并依據(jù)某種協(xié)議寫日志。這是因?yàn)?,已?jīng)提交的事務(wù)更新的數(shù)據(jù)的唯一永久副本是日志。日志管理程序的基本功能:1)日志管理程序?yàn)樗衅渌Y源管理器和事務(wù)管理器提供對日志表的讀寫訪問。2)日志管理程序?yàn)槿罩颈硖峁┟嫦蛴涗浀淖x接口和插入-刷新接口,資源管理器使用這些接口記載關(guān)于持久(可恢復(fù))對象的改變信息。如果某個(gè)事務(wù)需要被撤消

23、或重做,這個(gè)事務(wù)管理器使用這些接口讀回這些日志記錄交給資源管理器去處理。日志表中順序地存放著日志記錄,每個(gè)記錄都有一個(gè)頭,頭中包含了資源管理程序的名字、對該記錄進(jìn)行寫操作的事務(wù)的名字和日志管理程序所能理解的日常信息。每個(gè)日志記錄中的大部分是日志體,它包含了所有的UNDO-REDO信息,這些信息是由寫這個(gè)日志記錄的資源管理器生成的。日志管理程序并不理解日志體的內(nèi)容,僅僅是將它們看成字符串。日志記錄體通常有幾百個(gè)字節(jié),但也可能是幾百兆字節(jié)。3.2.3鎖管理器的功能說明這部分是為了實(shí)現(xiàn)并發(fā),由另一位同學(xué)研究和設(shè)計(jì)的。最后的目的是為了實(shí)現(xiàn)事務(wù)處理中的隔離。這里就不進(jìn)行說明。3.2.4事務(wù)管理器的功能說

24、明事務(wù)管理器除了能夠正常的標(biāo)識(shí)、開始、執(zhí)行一個(gè)事務(wù)。當(dāng)有失敗的情況出現(xiàn)時(shí),也要由事務(wù)管理器來協(xié)調(diào)恢復(fù),根據(jù)不同的情況具體的實(shí)現(xiàn)也就不同:1)事務(wù)回滾 事務(wù)管理器協(xié)調(diào)事務(wù)回滾到一個(gè)保存點(diǎn)或干脆取消(中止)該事務(wù),這種回滾和中止可以由任何參與者發(fā)起。2)資源管理器重啟 如果一個(gè)資源管理器失敗并重啟,則由事務(wù)管理器提供給它回到最近提交狀態(tài)所需要的日志記錄。3)系統(tǒng)重啟 計(jì)算機(jī)系統(tǒng)重啟時(shí),事務(wù)管理器幫助局部資源管理器恢復(fù)其永久性狀態(tài),同時(shí),也解決在系統(tǒng)崩潰或關(guān)機(jī)時(shí)處于不確定狀態(tài)的所有分布式事務(wù),這種機(jī)制也能實(shí)現(xiàn)事務(wù)管理器的重啟。4)介質(zhì)恢復(fù) 如果一個(gè)對象被破壞,通過使用這個(gè)對象的歸檔副本和自從這個(gè)對象

25、歸檔以來的所有對其更改的日志,事務(wù)管理器可以幫助資源管理器重建該對象?,F(xiàn)在只考慮單一事務(wù)管理器的事務(wù)和數(shù)據(jù)。如果是涉及到幾個(gè)機(jī)群的事務(wù)可能涉及到幾個(gè)事務(wù)管理器。如果對一個(gè)聯(lián)網(wǎng)的數(shù)據(jù)庫系統(tǒng)來說的話,情況也應(yīng)該是這樣的。4設(shè)計(jì)與實(shí)現(xiàn)4.1事務(wù)處理的簡單模型因?yàn)橐O(shè)計(jì)的事務(wù)處理是為數(shù)據(jù)庫服務(wù)的,所以用到多級(jí)事務(wù)模型。首先來看事務(wù)監(jiān)控器對一個(gè)遠(yuǎn)程事務(wù)的處理流程:入隊(duì)隊(duì)列事務(wù)請求判斷權(quán)限有成功事務(wù)計(jì)算出隊(duì)隊(duì)列發(fā)送到客戶錯(cuò)誤消息圖3事務(wù)監(jiān)控器對一個(gè)遠(yuǎn)程事務(wù)的處理一個(gè)遠(yuǎn)程事務(wù)請求開始,事務(wù)監(jiān)控器判斷其權(quán)限,然后把事務(wù)放到永久隊(duì)列中,從隊(duì)列中取出事務(wù)進(jìn)行事務(wù)計(jì)算。將計(jì)算的結(jié)果放到另一個(gè)隊(duì)列中,發(fā)送到客戶端去。

26、事務(wù)管理器對事務(wù)的控制過程:事務(wù)請求分配事務(wù)標(biāo)識(shí)符資源分配第一階段提交第二階段提交成功失敗事務(wù)結(jié)束事務(wù)回滾成功失敗圖4事務(wù)管理器對事務(wù)的控制過程發(fā)起一個(gè)事務(wù)請求,事務(wù)管理器為該事務(wù)分配一個(gè)唯一的事務(wù)標(biāo)識(shí)符,事務(wù)管理器在正常情況下只是維護(hù)事務(wù)的ACD特性。參與事物的所有資源管理器將進(jìn)行第一次表決時(shí),這是第一階段提交,如果第一階段提交通過,那么進(jìn)行第二階段提交,事務(wù)管理器強(qiáng)制寫日志表。標(biāo)識(shí)事務(wù)已經(jīng)完了。第二階段提交后,事務(wù)管理器向各個(gè)資源管理器通知事務(wù)已經(jīng)結(jié)束,資源管理器將調(diào)用鎖管理器,釋放鎖。如果在第一階段有資源管理器不同意,事務(wù)回滾。進(jìn)行補(bǔ)償事務(wù)的調(diào)用,補(bǔ)償事務(wù)是一定會(huì)成功的。(如果失敗,表示

27、系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)有問題)。如果是遠(yuǎn)端的,事務(wù)監(jiān)控器將把請求通過通信管理器發(fā)送出去。接收到一個(gè)遠(yuǎn)程處理,首先由事務(wù)監(jiān)控器來判斷是否有權(quán)限,然后把這個(gè)事務(wù)請求放入一個(gè)永久的隊(duì)列中,從隊(duì)列中取出進(jìn)行計(jì)算,將結(jié)果放到一個(gè)永久隊(duì)列中,由通信管理器將一定策略來發(fā)送,這里的策略是向終端連續(xù)發(fā)生三次。如果事務(wù)回滾將回滾的信息通過通信管理器來發(fā)送回終端。在一個(gè)事務(wù)的提交過程中都是要寫日志的,后面的回滾和恢復(fù)數(shù)據(jù)根據(jù)日志來的。它是很重要的。下一節(jié)的內(nèi)容是各個(gè)組件的具體設(shè)計(jì)。4.2具體的設(shè)計(jì)與細(xì)節(jié)事務(wù)標(biāo)識(shí)符的設(shè)計(jì)事務(wù)標(biāo)識(shí)符是很重要的對于事務(wù)處理來說。對于一個(gè)事務(wù)處理,事務(wù)標(biāo)識(shí)符必須始終是唯一的,每一個(gè)事務(wù)標(biāo)識(shí)符(t

28、rid)標(biāo)識(shí)一個(gè)具有ACID屬性的工作單元。此外trid能方便地表示出創(chuàng)建它的事務(wù)管理器,事務(wù)管理器也必須要記住有多少事務(wù),有可能會(huì)丟失事務(wù),就得由事務(wù)本身來標(biāo)識(shí)自己在事務(wù)管理器中是第幾個(gè)事務(wù)。所以事務(wù)標(biāo)識(shí)符的數(shù)據(jù)結(jié)構(gòu)由一個(gè)三元組組成<birthday,TMID,counter>組成第一個(gè)元素birthday是事務(wù)產(chǎn)生的時(shí)間,第二個(gè)元素TMID是事務(wù)管理器的標(biāo)識(shí)符,對于在網(wǎng)絡(luò)上的事務(wù)處理是很有用處的,對于本地機(jī)的事務(wù)處理這個(gè)編號(hào)是沒有作用的。第三個(gè)元素counter是事務(wù)在事務(wù)管理器中建立的序號(hào)。一般來說事務(wù)標(biāo)識(shí)是由一個(gè)可變的整型數(shù)組來表示。對于多級(jí)事務(wù)的標(biāo)識(shí)來說,頂層事務(wù),標(biāo)識(shí)事

29、務(wù)標(biāo)識(shí)的整型數(shù)組由一個(gè)元素構(gòu)成,隨著事務(wù)層次的逐漸降低,表示事務(wù)標(biāo)識(shí)的整型數(shù)組的元素個(gè)數(shù)逐漸,這是因?yàn)樾碌淖邮聞?wù)的標(biāo)識(shí)由其父事務(wù)標(biāo)識(shí)和一個(gè)區(qū)別兄弟事務(wù)區(qū)分的新元素構(gòu)成。這個(gè)策略簡單,也能滿足事務(wù)的大部分需求,但是空間開銷大。所以在具體的設(shè)計(jì)與編碼時(shí)是考慮用位段來存其標(biāo)識(shí)的。下面是一個(gè)事務(wù)標(biāo)識(shí)的結(jié)構(gòu)Typedef structTIMESTAMP birthday; /TM能記憶的最前的時(shí)間 TMID tmid; /事務(wù)管理器標(biāo)識(shí)符,在網(wǎng)絡(luò)中唯一 unsigned a:8TRID事務(wù)處理監(jiān)控器的設(shè)計(jì)當(dāng)一個(gè)事務(wù)從終端發(fā)送過來,并沒有直接發(fā)送給服務(wù)器。事務(wù)處理監(jiān)控器獲得這一信息,對其權(quán)限進(jìn)行檢查之后。

30、通過一定的策略啟動(dòng)服務(wù),有時(shí)并不是馬上啟動(dòng)服務(wù)。判斷請求的類型,如果請求是一個(gè)立即的,馬上執(zhí)行,結(jié)果迅速返回,如果請求不是一個(gè)立即的,一般就要將它放到一個(gè)持久的隊(duì)列中,如果在執(zhí)行立即事務(wù)時(shí),服務(wù)器為請求服務(wù)時(shí)出現(xiàn)了一個(gè)峰值一般的解決方法是建立一個(gè)臨時(shí)的隊(duì)列,峰值消失的時(shí)候該隊(duì)列也就消失了。用異步方式高度事務(wù)處理請求需要使用隊(duì)列。原因是有以下兩個(gè)方面:在直接的聯(lián)機(jī)事務(wù)處理中,暫時(shí)性的系統(tǒng)過載會(huì)導(dǎo)致對某一資源管理的請求在相應(yīng)的服務(wù)器類前等待。這時(shí)構(gòu)造的隊(duì)列是揮發(fā)的。TP監(jiān)控器把它們作為臨時(shí)控制塊在自己共享數(shù)據(jù)結(jié)構(gòu)池中維護(hù)。第二類型的隊(duì)列是用于隊(duì)列事務(wù)處理的,這種事務(wù)處理的特點(diǎn)就是異步。請求被發(fā)送到

31、永久的請求隊(duì)列中去,而不是通過TRPC從請求的一方直接發(fā)送到服務(wù)器上的。日志管理器的設(shè)計(jì)日志管理程序把日志作為SQL表來實(shí)現(xiàn),因此通過SQL查詢可以讀日志表。日志管理程序用一組操作來封裝日志的寫操作。對日志表的設(shè)計(jì),在日志表中,每個(gè)記錄都有唯一的碼,稱做日志序號(hào)。下面是用SQL語言表示的日志表定義:create domain LSN unsigned interger(64);-日志序號(hào)(文件號(hào),rba)create domain RMID unsigned interger(64);-資源管理程序標(biāo)識(shí)符create domain TRID unsigned interger(64);-事務(wù)標(biāo)

32、識(shí)符create table log_table(lsn LSN, -記錄的日志序號(hào)prev_lsn LSN, -日志中前一個(gè)記錄的lsntimestamp TIMESTAMP, -日志記錄的創(chuàng)建時(shí)間resource_manager RMID, -寫這個(gè)日志記錄的資源管理器trid TRID, -寫這個(gè)記錄的事務(wù)tran_prev_lsn LSN, -該事務(wù)的前一個(gè)日志記錄(或0)body varchar, -日志數(shù)據(jù)。primary key (lsn) -lsn為主碼foreign key(prev_lsn) -前一個(gè)日志記錄在這個(gè)表中 references log_table(lsn),

33、-foreign key(tran_prev_lsn) -該事務(wù)的前一個(gè)日志記錄也在這表中 refernces log_table(lsn), -)entry sequenced; -在文件尾進(jìn)行插入日志文件通常是雙工的,以免單個(gè)日志文件的存儲(chǔ)失敗造成日志破壞。而且這兩個(gè)物理文件序列通常被分別存放在不同的目錄空間中,這主要是為了降低日志被破壞的風(fēng)險(xiǎn)。系統(tǒng)初始化后,首先為日志分配兩個(gè)物理文件,隨著日志的增長,這些文件被寫滿之后,系統(tǒng)會(huì)再分配另外的兩個(gè)物理文件來登記下個(gè)日志記錄。這個(gè)過程是可一直持續(xù)下去的。雙工的兩個(gè)日志文件將使用標(biāo)準(zhǔn)的文件名,并分別以LOGA00000000和LOGB000000

34、00格式結(jié)尾,這里的0用該文件在日志目錄中的文件索引來填寫。由于可用算法計(jì)算出第n個(gè)日志文件的名字,所以日志管理程序只要維護(hù)一個(gè)記錄就可以描述每個(gè)日志(這個(gè)記錄只需要存儲(chǔ)日志文件名的公共前綴和當(dāng)前日志文件的索引):如下偽代碼所示:struct log_files filename a_prefix;/”a”日志文件的目錄 filename b_prefix;/“b”日志文件的目錄 long index;/當(dāng)前文件的索引這個(gè)信息構(gòu)成日志錨點(diǎn)這種數(shù)據(jù)結(jié)構(gòu)的核心內(nèi)容,日志錨點(diǎn)在主存中緩存,且至少被記錄到持久存儲(chǔ)器的兩個(gè)不同的地方,通常是在兩個(gè)文件中,這樣是考慮到系統(tǒng)重新啟動(dòng)時(shí)可以找到日志錨點(diǎn)。日志序

35、號(hào)如前所述,每個(gè)記錄都有一個(gè)唯一的標(biāo)識(shí)符,將這個(gè)標(biāo)識(shí)符稱為日志序號(hào)(LSN)。LSN是由記錄的文件號(hào)和這個(gè)記錄在文件中的相對字節(jié)偏移量組成的。LSN的定義如下:typedef structlong file; /在日志目錄中日志文件號(hào) long rba; /記錄(第1個(gè)字節(jié))在文件中的相對字節(jié)地址 LSN;/日志序號(hào)定義日志讀寫的細(xì)節(jié)設(shè)計(jì):讀日志問題相對比較簡單。除了最后一個(gè)日志記錄外,不用加鎖就可讀取所有日志記錄,但是最后一個(gè)日志記錄正在被更新時(shí),它是不能被讀取時(shí)。日志管理程序?qū)Υ蠖鄶?shù)日志頁采用樂觀讀取方式:只讀雙工日志的一個(gè)副本。當(dāng)然有一定危險(xiǎn)性的??梢酝ㄟ^維護(hù)一個(gè)標(biāo)志來檢測這種情況:在每

36、個(gè)日志頁上設(shè)置一個(gè)標(biāo)志量,標(biāo)志量的什用來指示這個(gè)頁是否已滿。因?yàn)槿罩臼琼樞驅(qū)懭氲?,所以除了最后一頁外所有的頁都是滿期的,標(biāo)志量值都置為真。由于最后一頁大多數(shù)都江堰市緩沖在內(nèi)存中,因而其存取不需要I/O操作。這樣便可以進(jìn)行安全的樂觀讀。在寫日志時(shí),要謹(jǐn)慎寫:串行寫和乒乓寫,雙工日志表可以屏蔽絕大多數(shù)介質(zhì)故障,但是有一種情況則不行。最后一個(gè)日志頁的信息未滿期,下一個(gè)日志記錄將被加到這個(gè)日志頁上。如果在寫的過程中斷電,或處理器錯(cuò)誤,這種簡單的寫操作會(huì)損壞原來頁中已有的信息。處理這個(gè)問題的辦法有兩個(gè),一個(gè)是串行寫,先寫一份日志(副本),當(dāng)這個(gè)日志寫完后,再寫另一個(gè)日志(副本)。串行寫花費(fèi)的時(shí)間是原來的

37、兩倍。另一個(gè)辦法是乒乓寫算法。假設(shè)日志的最后一頁稱為pagej,pagej非空,并且打算用新增的數(shù)據(jù)覆蓋pagej。這種情況下,先將新增加的數(shù)據(jù)寫入pagej+1,而后在pagej+1和pagej之間乒乓式來回重寫。當(dāng)從磁盤讀入的時(shí)候,必須讀最后兩頁(j和j+1)并且接受時(shí)間戳較大的那頁。鎖管理器的設(shè)計(jì)鎖管理器的設(shè)計(jì)由另一位同學(xué)設(shè)計(jì)。此處不再提出。在這里事務(wù)管理器只是負(fù)責(zé)了事務(wù)特性的A(原子性)、C(一致性)、D(永久性),I(隔離性)由鎖管理器去負(fù)責(zé)。事務(wù)管理器的設(shè)計(jì)在正常處理中,資源管理器和系統(tǒng)都不會(huì)失敗。應(yīng)用程序通過Begin_Wrok()、Save_Work()、Prepare_Wor

38、k()、Commit_Work()、Rollback_Work()及Read_Context()調(diào)用事務(wù)管理器,此外資源管理器通過ldentify()和Join_Work()調(diào)用事務(wù)管理器。事務(wù)管理器數(shù)據(jù)結(jié)構(gòu)是這樣的:事務(wù)管理器連同TP監(jiān)控器一起保存了一個(gè)數(shù)據(jù)結(jié)構(gòu),用以描述已調(diào)用ldentify()的每個(gè)資源管理器。同時(shí),事務(wù)管理器為每一個(gè)活的事務(wù)也保存一個(gè)數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)包括該事務(wù)的狀態(tài)、日志記錄、參與這個(gè)事務(wù)的資源管理器以有分配給該事務(wù)的會(huì)話。作為應(yīng)用接口,所設(shè)計(jì)事務(wù)管理器提供了如下的命令以供調(diào)用:TRID Begin_Work(context *);/開始一個(gè)事務(wù)Bool Commit

39、_Work(context *);/提交該事務(wù)void Abord_Work(void);/回滾到保存點(diǎn)0savepoint Save_Work(context *);/建立一個(gè)保存點(diǎn)savepoint Rollback_Work(savepoint);/返回到保存點(diǎn)(返回到保存點(diǎn)0即中止)Bool Prepare_Work(savepoint);/將事務(wù)置為準(zhǔn)備就緒狀態(tài)context Read_Context(void);/返回到當(dāng)前保存點(diǎn)上下文TRID Chain_Work(context *);/結(jié)束當(dāng)前事務(wù),開始下一事務(wù)TRID My_Trid(void);/返回當(dāng)前事務(wù)標(biāo)識(shí)符TRID

40、 Leave_Transaction(void);/設(shè)置進(jìn)程TRID為空,返回當(dāng)前標(biāo)識(shí)符Bool Resume_Transaction(TRID);/設(shè)置進(jìn)程TRID為期望TRIDenum tran_statusACTIVE,PREPARED,ABORTING,COMMITTING,ABORTED,COMMITTED;tran_status Status_Transaction(TRID);/返回一個(gè)事務(wù)標(biāo)識(shí)符狀態(tài)關(guān)于Begin_Work()它的邏輯是:分配一個(gè)新的事務(wù)標(biāo)識(shí)符,在事務(wù)表中加一個(gè)入口項(xiàng)(entry),對該入口項(xiàng)進(jìn)行格式化以反映保存點(diǎn)1。然后,事務(wù)管理器寫一條開始事務(wù)日志記錄,這會(huì)

41、引起日志管理程序?qū)δ莻€(gè)日志記錄在該事務(wù)入口項(xiàng)中設(shè)置min LSN和max LSN指針,日志管理程序維護(hù)該LSN字段,鎖管理器維護(hù)translock_list。事務(wù)可以建立一個(gè)持久的保存點(diǎn)(意思是重啟時(shí)仍然存在),則Begin_Work()請求把日志記錄強(qiáng)制寫入持久性存儲(chǔ)器。最后,設(shè)置該里程事務(wù)標(biāo)識(shí)符為該trid,從這類保存點(diǎn)直到進(jìn)程提交、中止或離開該事務(wù),該進(jìn)程的一切工作和它發(fā)出的所有RPC都用這個(gè)trid來標(biāo)識(shí)。下面是有關(guān)這個(gè)處理的偽代碼:TRID Begin_Work(context * it,Bool soft)TransCB * trans;/事務(wù)描述符TRID him;/新的trid

42、TM_savepoint save;/被寫入的保存點(diǎn)記錄if(MyTrid()!=NULLTrid) return (NULLTrid);/保持其為空Him=TM_anchor.next_trid;/賦值給它的下一個(gè)tridTM_anchor.next_trid.sequence+;/使下一個(gè)trid加1(MyProccess()->trid=him;/令其為該進(jìn)程的trid/分配,格式化事務(wù)控制塊Trans=malloc(sizeof(TransCB);/分配一個(gè)事務(wù)入口Trans->next=TM_anchor.tran_list;/將事務(wù)加入到事務(wù)列表中TM_anchor.t

43、ran_list=trans;trans->trid=him;/設(shè)置它的tridtrans->status=ACTIVE;/設(shè)置它的狀態(tài)為“活動(dòng)的”trans->save_pt=1;trans->next_save_pt=2;/當(dāng)前保存點(diǎn)為1,下個(gè)保存點(diǎn)為2trans->RM_list=trans->lock_list=trans->ses_list=NULL;/還有會(huì)話、鎖及資源/格式化,寫開始事務(wù)(保存點(diǎn)1)日志記錄save.record_type=begin;/設(shè)置日志記錄體類型save.save_pt_num=1;save.soft=soft;

44、/格式化保存點(diǎn)記錄save.num_RM=save.sessions=0;/僅僅是現(xiàn)在參與的事務(wù)管理器copy(save.it,it,it.length);/加入它的上下文trans->save_pt_lsn=log_insert(save,sizeof(save);/寫開始事務(wù)日志記錄/給出log_insert()如何更新min lsn和max lsnif(!soft)log_flush(trans->max_lsn,FALSE);/如果是持久化的開始,強(qiáng)制寫入日志return (him);/返回trid給him;提交事務(wù)很簡單。通過調(diào)用 資源管理器的Prepare()回調(diào)請求,

45、資源管理器投票,;通過發(fā)送Prepare()TRPC,進(jìn)行投票表決,然后,可以投贊同票也可以投反對票。若都為贊成票那么事務(wù)準(zhǔn)備提交。此時(shí),提交調(diào)用 寫一條提交記錄(保存點(diǎn)記錄),并強(qiáng)制其寫入持久存儲(chǔ)器。然后,提交操作向局部資源管理器及通過Commit() TRPC向遠(yuǎn)程會(huì)話廣播這個(gè)提交決定。當(dāng)它們都做出響應(yīng)時(shí),事務(wù)管理器就在日志中寫一條完成記錄,釋放事務(wù)控制塊。整個(gè)Commit_Work()邏輯大致如下:Bool Commit_Work(context *it ,Bool lazy)if Prepare_Work()/嘗試準(zhǔn)備事務(wù)commit();/如果準(zhǔn)備成功,那么做第2階段工作elseRo

46、llback_Work(0);一般來說問題都出在提交的階段1,如果在提交的階段2出現(xiàn)了錯(cuò)誤,事務(wù)管理器最終必須發(fā)送該消息并從資源管理器或遠(yuǎn)程事務(wù)管理器處得到響應(yīng)。下面是這種情況下的大致代碼:void session_failure(SECB* session)/向遠(yuǎn)程TM持久發(fā)送Commit()TRPCTransCB* trans=MyTransP();/指向進(jìn)程的事務(wù)描述符的指針Bool timeout=TRUE;/表明TRPC超時(shí)的標(biāo)志TM_savepoint save;/被格式化的完成記錄RMID TM=session->him;/接受commit()回調(diào)的遠(yuǎn)程TM的名字while

47、(timeout)/重復(fù)TRPC直到有確認(rèn)TM.Commit();/通知遠(yuǎn)程事務(wù)管理器提交free session;/如果有確認(rèn),則從事務(wù)中釋放會(huì)話if(trans->RM_list=NULL && trans->ses_list=NULL)/如果所有的資源管理器都完成(被釋放)而且如果所有的聯(lián)出會(huì)話已提交trans_>status=COMMITTED;/進(jìn)入committed狀態(tài)save.record_type=commit_complete;/設(shè)置日志記錄類型為已完成log_insert(save,sizeof(save);/惰性寫完成記錄dequeue

48、and free frans structure;/釋放事務(wù)控制塊,已完成exit();/進(jìn)程完成,結(jié)束進(jìn)程;事務(wù)的回滾邏輯:UNDO掃描程序反向掃描日志,回滾能返回到以前的任一個(gè)保存點(diǎn)。當(dāng)UNDO掃描程序到達(dá)要求的保存點(diǎn)時(shí),事務(wù)管理器輪詢每個(gè)資源管理器,請它重新實(shí)例化該保存點(diǎn)。最終,UNDO掃描程序找到一個(gè)所有資源管理器都同意的保存點(diǎn),或到保存點(diǎn)0(事務(wù)全部撤消),資源管理器無論如何是不允許否決保存點(diǎn)0。代碼如下:long Rollback_Work(long target_savepoint)TransCB * trans=MyTransP();/指向進(jìn)程事務(wù)描述符的指針TM_savepo

49、int save;/被格式化的保存點(diǎn)記錄LSN lsn;/用于撤消掃描的lsnRMID rmid;/從日志記錄中抽取出的rmidlog_record_header header;/保存日志記錄頭的緩沖區(qū)bool abort=FALSE;/表明UNDO失敗,以便中止該事務(wù)if(MyTrid()=NULLTrid)return (0);/事務(wù)已經(jīng)中止lsn=trans->max_lsn;/得到最后一條日志記錄的lsn/UNDO掃描程序反向掃描日志while(lsn!=NULLLSN)/在日志中進(jìn)行撤消掃描log_read(lsn,&header,save,sizeof(save);/讀日志記錄頭rmid=header.rmid;/提取資源管理器標(biāo)識(shí)符rmid.undo(lsn);/調(diào)用它撤消日志記錄if(timeout | error) abort =TRUE;/若撤消失敗,初始化事務(wù)的中止if(!abort &&/若撤消沒失?。ㄋ谐废纪瓿桑﹖rans->save_pt&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論