專利名稱::基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及的是一種計算機應(yīng)用
技術(shù)領(lǐng)域:
的方法,具體是一種基于網(wǎng)格的自動產(chǎn)生補償事務(wù)的方法。技術(shù)背景由于網(wǎng)絡(luò)延遲和商業(yè)過程的交互,即使在沒有并發(fā)事務(wù)的情況下,商業(yè)事務(wù)一般也會持續(xù)比較長的時間,因而也被稱為長事務(wù)。為了減少資源被占用的時間,提高資源利用率和系統(tǒng)性能,組成長事務(wù)的子事務(wù)應(yīng)該在全局事務(wù)結(jié)束之前提交并釋放其占用的資源。如果某些子事務(wù)失敗或用戶需要選擇提交結(jié)果時,對已提交子事務(wù)的撤銷必須用執(zhí)行相反任務(wù)的補償事務(wù)來完成。1987年Garcia-Molina等人在《ProceedingsofInternationalConferenceonManagementofData,ACMSIGMODRecord16(3)》(ACMSIGM0D論文集16巻第3期)上發(fā)表了"Sagas(—種長事務(wù)模型)",該文提出了一種減少長事務(wù)資源占用時間的方法,即將長事務(wù)拆分成一組預(yù)先定義好執(zhí)行順序的子事務(wù)L(1《i《n),并為每個子事務(wù)編寫一個補償事務(wù)Ci(l《i《n),每個補償事務(wù)G能語義地撤消由Ti的提交對系統(tǒng)產(chǎn)生的影響。該方法中,每一個子事務(wù)被允許單獨提交,并立即釋放其占用的資源,以提高資源的利用率?;谠撃P停胁簧偃藢Υ俗髁诉M(jìn)一步的改進(jìn)。經(jīng)對現(xiàn)有技術(shù)文獻(xiàn)的檢索發(fā)現(xiàn),Nodine等在《ProceedingsoftheTwenty-SeventhHawaiiInternationalConferenceonSystemSciences》(IEEE第27屆Hawaii國際系統(tǒng)科學(xué)會議論文集)中基于Sagas的思想,提出了如何在多數(shù)據(jù)庫事務(wù)中進(jìn)行事務(wù)補償,該方法通過步驟方法(st印approach)將若干本地數(shù)據(jù)庫集成為一個多數(shù)據(jù)庫系統(tǒng);每個本地數(shù)據(jù)庫被封裝成一組步驟(st印s),每個步驟有一個關(guān)聯(lián)的補償步驟(compensatingst印),當(dāng)事務(wù)需要補償時,相關(guān)的補償步驟被調(diào)用。上述方法的不足之處在于它們要求應(yīng)用開發(fā)者在編寫事務(wù)性應(yīng)用程序時,必須為每一個子事務(wù)提供相應(yīng)的補償事務(wù)。這樣的要求難以適應(yīng)網(wǎng)格環(huán)境,主要原因是(1)網(wǎng)格服務(wù)具有自治性。服務(wù)提供者可以根據(jù)自身的商業(yè)模式設(shè)置特定的補償要求,應(yīng)用開發(fā)者在開發(fā)階段無法知道在事務(wù)執(zhí)行之前動態(tài)發(fā)現(xiàn)的網(wǎng)格服務(wù)具有哪些特殊的補償要求。(2)大大增加了事務(wù)性網(wǎng)格應(yīng)用的開發(fā)工作量與復(fù)雜性。與分布式數(shù)據(jù)庫事務(wù)相比,網(wǎng)格服務(wù)涉及的操作及應(yīng)用語義要復(fù)雜得多,編寫補償事務(wù)給關(guān)鍵性網(wǎng)格應(yīng)用的開發(fā)帶來了很大的工程量和復(fù)雜性及其困難。
發(fā)明內(nèi)容本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)中的不足,提供一種基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,即在長事務(wù)執(zhí)行過程中動態(tài)產(chǎn)生相應(yīng)的補償事務(wù),為網(wǎng)格環(huán)境下透明的事務(wù)補償提供支持,同時,用戶也可以使用自動產(chǎn)生的補償事務(wù)對子事務(wù)的提交結(jié)果進(jìn)行選擇。本發(fā)明是通過以下技術(shù)方案實現(xiàn)的,本發(fā)明包括如下步驟首先創(chuàng)建針對數(shù)據(jù)修改事件產(chǎn)生補償操作的行級觸發(fā)器,然后由補償事務(wù)產(chǎn)生器始終監(jiān)視著子事務(wù)的執(zhí)行;其次當(dāng)影響系統(tǒng)狀態(tài)的事件發(fā)生時,補償事務(wù)產(chǎn)生器根據(jù)事件的類型調(diào)用相應(yīng)的行級觸發(fā)器,自動產(chǎn)生從語義上撤銷該事件影響的補償操作;最后,當(dāng)子事務(wù)提交時,補償事務(wù)產(chǎn)生器將該子事務(wù)執(zhí)行過程中所產(chǎn)生的補償操作組合成補償事務(wù),完成自動產(chǎn)生補償事務(wù)。所述的行級觸發(fā)器,是指基于數(shù)據(jù)庫的觸發(fā)器機制創(chuàng)建的針對數(shù)據(jù)修改事件而產(chǎn)生語義相反的補償操作的三個存儲過程模塊,分別用于補償更新、插入、刪除三種語句,動態(tài)產(chǎn)生相應(yīng)數(shù)據(jù)修改事件的補償操作。行級觸發(fā)器根據(jù)數(shù)據(jù)表中行的標(biāo)識符對被修改的所有行進(jìn)行補償,不需要逐行匹配記錄,從而加快補償操作的產(chǎn)生速度,提高系統(tǒng)性能。行級觸發(fā)器的工作過程具體如下(1)創(chuàng)建行級觸發(fā)器提供數(shù)據(jù)表的名字,根據(jù)名字可從用戶表視圖中獲得數(shù)據(jù)表的結(jié)構(gòu)信息,包括所有字段名稱以及字段的數(shù)據(jù)類型,因為數(shù)據(jù)庫的USER—TAB—COLUMNS視圖提供了靜態(tài)數(shù)據(jù)詞典視圖,靜態(tài)數(shù)據(jù)詞典視圖描述了視圖的相關(guān)結(jié)構(gòu)信息,每個數(shù)據(jù)表產(chǎn)生create—insert—trigger(插入行級觸發(fā)器),create—update—trigger(更新行級觸發(fā)器),create_delete_trigger(刪除行級觸發(fā)器)三個存儲過程模塊,即三個行級觸發(fā)器,它們分別用于補償插入、更新、刪除語句,三個行級觸發(fā)器的輸入?yún)?shù)都是其服務(wù)的數(shù)據(jù)表名稱,當(dāng)被調(diào)用時,它們產(chǎn)生補償插入、更新、刪除的補償操作。(2)行級觸發(fā)器動態(tài)產(chǎn)生數(shù)據(jù)修改事件的補償操作當(dāng)數(shù)據(jù)修改事件出現(xiàn)時,補償事務(wù)產(chǎn)生器根據(jù)事件類型調(diào)用相應(yīng)的行級觸發(fā)器,行級觸發(fā)器生成具體的補償操作,補償操作是在子事務(wù)的執(zhí)行過程中動態(tài)產(chǎn)生的,假如子事務(wù)失敗了,則在該子事務(wù)執(zhí)行過程中所產(chǎn)生的所有補償操作也被放棄,具體過程如下在插入事件出現(xiàn)時,產(chǎn)生相應(yīng)的刪除語句將插入的記錄刪除;在刪除事件出現(xiàn)時,產(chǎn)生相應(yīng)的插入語句將刪除的記錄再次插入;在更新事件出現(xiàn)時,需要將被改變的記錄恢復(fù)成更新前的數(shù)據(jù)。在產(chǎn)生補償操作的過程中,行級觸發(fā)器通過數(shù)據(jù)表的結(jié)構(gòu)信息,判斷字段的數(shù)據(jù)類型;使用字符串拼接的方式,動態(tài)產(chǎn)生補償操作。對于不同的數(shù)據(jù)類型,處理方式有所不同對數(shù)值型的數(shù)據(jù),直接與補償操作片斷的字符常量連接;對字符串型的數(shù)據(jù),則需要在這個值之前和之后,分別拼接一個單引號,作為補償操作中字符串直接量的開始與中止符;對日期時間型的數(shù)據(jù),需要首先將值轉(zhuǎn)化為字符串,然后在產(chǎn)生的補償操作中利用TO—DATE函數(shù)將字符串值重新轉(zhuǎn)換為日期時間。所述的補償事務(wù)產(chǎn)生器,是指用于動態(tài)產(chǎn)生補償事務(wù)包括三個行級觸發(fā)器的模塊。補償事務(wù)產(chǎn)生器在子事務(wù)從開始到被確認(rèn)或撤銷的整個過程中,補償事務(wù)產(chǎn)生器監(jiān)視各種影響系統(tǒng)狀態(tài)的事件;當(dāng)影響系統(tǒng)狀態(tài)的事件出現(xiàn)時,補償事務(wù)產(chǎn)生器執(zhí)行相應(yīng)動作對于事務(wù)上下文消息,記錄全局事務(wù)標(biāo)識符和輸入?yún)?shù);預(yù)提交消息表示事務(wù)中包含的數(shù)據(jù)修改操作開始被執(zhí)行,因此,補償事務(wù)產(chǎn)生器開始根據(jù)子事務(wù)中數(shù)據(jù)修改操作的類型調(diào)用相應(yīng)的行級觸發(fā)器,自動產(chǎn)生數(shù)據(jù)修改事件的補償操作,并在子事務(wù)成功提交后使用定界符將補償操作封裝成補償事務(wù),然后存儲在數(shù)據(jù)庫中;對于撤銷消息,調(diào)用存儲在數(shù)據(jù)庫中的補償事務(wù);對于確認(rèn)消息,刪除存儲在數(shù)據(jù)庫中的補償事務(wù)。網(wǎng)格長事務(wù)由多個子事務(wù)組成,分別由處于不同網(wǎng)絡(luò)節(jié)點上的網(wǎng)格服務(wù)來完成,補償事務(wù)產(chǎn)生器被安裝于實際執(zhí)行子事務(wù)的每一個網(wǎng)格服務(wù)上。所述的影響系統(tǒng)狀態(tài)的事件,是指改變事務(wù)處理系統(tǒng)狀態(tài)的各種外部操作事件,有三大類事務(wù)協(xié)調(diào)事件、數(shù)據(jù)修改事件和服務(wù)自定義事件。所述事務(wù)協(xié)調(diào)事件是指子事務(wù)從協(xié)調(diào)者收到了事務(wù)協(xié)調(diào)消息,包括事務(wù)上下文消息、預(yù)提交消息、撤銷消息、確認(rèn)消息,所述事務(wù)上下文消息用于協(xié)調(diào)者通知參加者事務(wù)開始、事務(wù)標(biāo)識符、事務(wù)類型、協(xié)調(diào)者網(wǎng)絡(luò)地址、事務(wù)執(zhí)行有效期等信息;所述預(yù)提交消息用于協(xié)調(diào)者通知參加者提交;所述確認(rèn)和撤銷消息分別用于用戶確認(rèn)和撤消已經(jīng)提交的子事務(wù)。所述數(shù)據(jù)修改事件是指子事務(wù)中包含的改變數(shù)據(jù)庫中數(shù)據(jù)的操作,本發(fā)明針對關(guān)系型數(shù)據(jù)庫,因而數(shù)據(jù)修改操作包括插入(insert)、刪除(delete)和更新(update)。所述服務(wù)自定義事件是指網(wǎng)格服務(wù)提供者根據(jù)自身需要設(shè)置的特殊要求,如對撤銷訂單的用戶收到一定的違約金。所述的自動產(chǎn)生數(shù)據(jù)修改事件的補償操作,是指根據(jù)數(shù)據(jù)修改的三類操作即插入、刪除和更新,分別調(diào)用相應(yīng)的行級觸發(fā)器,產(chǎn)生補償操作。必須遵循的原則是,一段時間內(nèi),一個數(shù)據(jù)庫被多個并發(fā)事務(wù)訪問,假設(shè)事務(wù)歷史H=1>1>0\,i^j,原事務(wù)Ti所訪問的數(shù)據(jù)對象被并發(fā)的依賴事務(wù)Tj所修改,補償事務(wù)CT,只能撤銷由原事務(wù)Ti本身提交所作出的所有改變,但不改變依賴事務(wù)力的提交結(jié)果。所述的補償操作記錄在數(shù)據(jù)庫中,多個并發(fā)事務(wù)產(chǎn)生的補償操作存放在同一張表中,相互之間用事務(wù)標(biāo)識符加以區(qū)分,對于同一個全局事務(wù)的多個子事務(wù),當(dāng)訪問同一站點的不同服務(wù)時,它們的補償操作在同一個記錄補償操作的數(shù)據(jù)庫中,因此使用全局事務(wù)標(biāo)識符和執(zhí)行子事務(wù)的網(wǎng)格服務(wù)名的組合加以唯一區(qū)分。所述的補償操作與原事務(wù)的執(zhí)行順序相反,在記錄補償操作時,還需要附加一個序列號,指示此補償操作產(chǎn)生的先后順序,使得后產(chǎn)生的補償操作先執(zhí)行,先產(chǎn)生的補償操作后執(zhí)行,這個序列號是時間戳,或是從一個序列中選擇的遞增的序列號。所述產(chǎn)生補償操作的行級觸發(fā)器、記錄補償操作的數(shù)據(jù)庫、以及遞增的序列號,這些數(shù)據(jù)庫對象均通過存儲過程來創(chuàng)建,通過提供一個補償操作包,提供3個存儲過程用于創(chuàng)建這3種對象。所述自動產(chǎn)生補償事務(wù),是指如果子事務(wù)提交成功,補償事務(wù)產(chǎn)生器將產(chǎn)生的補償操作封裝在開始(Begin)和提交(Commit)之間,構(gòu)成一個完整的事務(wù),新產(chǎn)生的補償事務(wù)被存儲在數(shù)據(jù)庫中,在需要時執(zhí)行補償事務(wù);如果子事務(wù)提交失敗,所有產(chǎn)生的補償操作都將被放棄,當(dāng)下一個事務(wù)執(zhí)行時,產(chǎn)生的補償操作屬于另一個補償事務(wù)。與現(xiàn)有技術(shù)相比,本發(fā)明的方法支持網(wǎng)格環(huán)境下補償事務(wù)的自動產(chǎn)生,可以減少網(wǎng)格長事務(wù)應(yīng)用的開發(fā)工作量和開發(fā)周期近50%,便于用戶對事務(wù)提交結(jié)果的選擇,從而解決了
背景技術(shù):
的不足。由于在網(wǎng)格長事務(wù)執(zhí)行過程中動態(tài)產(chǎn)生補償事務(wù),本發(fā)明可以為網(wǎng)格環(huán)境下的關(guān)鍵性應(yīng)用提供透明的可靠性支持;突破自治的網(wǎng)格服務(wù)提供者設(shè)置特殊補償要求的限制,這些為網(wǎng)格技術(shù)在商業(yè)環(huán)境的透明應(yīng)用提供了技術(shù)支撐。圖1為本發(fā)明工作原理框圖;圖2為本發(fā)明執(zhí)行補償事務(wù)的類的示意圖。具體實施方式下面結(jié)合附圖對本發(fā)明的實施例作詳細(xì)說明本實施例在以本發(fā)明技術(shù)方案為前提下進(jìn)行實施,給出了詳細(xì)的實施方式和具體的操作過程,但本發(fā)明的保護(hù)范圍不限于下述的實施例。如圖1所示,本實施例基于關(guān)系數(shù)據(jù)庫Oracle,本實施例實現(xiàn)過程如下步驟一,創(chuàng)建針對數(shù)據(jù)修改事件產(chǎn)生補償操作的行級觸發(fā)器;所述的行級觸發(fā)器,是指基于數(shù)據(jù)庫的觸發(fā)器機制創(chuàng)建的針對數(shù)據(jù)修改事件而產(chǎn)生語義相反的補償操作的三個存儲過程模塊,分別用于補償更新、插入、刪除三種語句,動態(tài)產(chǎn)生相應(yīng)數(shù)據(jù)修改事件的補償操作。行級觸發(fā)器根據(jù)數(shù)據(jù)表中行的標(biāo)識符對被修改的所有行進(jìn)行補償,不需要逐行匹配記錄,從而加快補償操作的產(chǎn)生速度,提高系統(tǒng)性能。提供數(shù)據(jù)表的名字,根據(jù)名字可從用戶表視圖中獲得數(shù)據(jù)表的結(jié)構(gòu)信息,包括所有字段名稱以及字段的數(shù)據(jù)類型,因為數(shù)據(jù)庫的USER_TAB_COLUMNS視圖提供了靜態(tài)數(shù)據(jù)詞典視圖,靜態(tài)數(shù)據(jù)詞典視圖描述了視圖的相關(guān)結(jié)構(gòu)信息,用戶表視圖中部分與表結(jié)構(gòu)相關(guān)的字段列在表1中。表1USERJTABj:OLUMNS(用戶表)視圖中部分與表結(jié)構(gòu)相關(guān)的字段<table>tableseeoriginaldocumentpage11</column></row><table>本實施例每個數(shù)據(jù)表產(chǎn)生createjnsert一trigger(插入行級觸發(fā)器),create—update—trigger(更新行級觸發(fā)器),create—delete—trigger(刪除行級觸發(fā)器)三個存儲過程模塊,即三個行級觸發(fā)器,它們分別用于補償插入、更新、刪除語句,三個行級觸發(fā)器的輸入?yún)?shù)都是其服務(wù)的數(shù)據(jù)表名稱,當(dāng)被調(diào)用時,它們產(chǎn)生補償插入、更新、刪除的補償操作。創(chuàng)建行級觸發(fā)器遵循以下二個原則(1)語義上撤銷原操作的影響。行級觸發(fā)器按表2如示的原則產(chǎn)生相應(yīng)的補償操作。在表1中,opi是Tj中的操作;0Pj是依賴事務(wù)Tj中的相關(guān)操作。表中涉及到兩種替代概念相關(guān)替代和無關(guān)替代,相關(guān)替代指的是Ti提交后的狀態(tài)Siw是和提交前的狀態(tài)Si相關(guān)的,即Sw-f(Si,Ti),此時,copi必須消除opi的影響。例如,如果oppupdate(di,d2)并且d產(chǎn)d一n,則其補償操作是cop;=update(d3,d4),這里d4=d3-n;無關(guān)替代是指Si+1與Si無關(guān),即Si+1=f(Ti),這種替代操作不需要被補償。如oPi=update("Monday","Tuesday"),opj=update("Tuesday",Wednesday")。(2)不影響并發(fā)事務(wù)的提交結(jié)果。一段時間內(nèi),一個數(shù)據(jù)庫可能被多個并發(fā)事務(wù)訪問,在實施例中,如果事務(wù)歷史H-Ti。Tj。CTj(i^),Ti所訪問的數(shù)據(jù)對象被并發(fā)的依賴事務(wù)Tj所修改,則補償只能從語義上撤銷事務(wù)Ti的影響,也就是說,補償事務(wù)CTi只能撤銷由原事務(wù)Tj本身提交所作出的所有改變,但不改變依賴事務(wù)Tj的提交結(jié)果。表2行級觸發(fā)器對數(shù)據(jù)修改操作的補償原則<table>tableseeoriginaldocumentpage11</column></row><table><table>tableseeoriginaldocumentpage12</column></row><table>下面是實施例中補償刪除操作的行級觸發(fā)器create—delete—trigger的部分代碼,各段意義如下CREATEORREPLACEPROCEDUREcreate_delete—trigger聲明存儲過程開始,其輸入?yún)?shù)是table_iiame(即數(shù)據(jù)表名稱)。EXECUTEIMMEDIATE'...,||'...,||…動態(tài)組裝補償操作。由于每張數(shù)據(jù)表的結(jié)構(gòu)各不相同,數(shù)據(jù)表名table—name等信息只有在運行時才能獲得,因此,觸發(fā)器的創(chuàng)建有必要使用一種自動化的方式。PL/SQL語肓提供的EXECUTEIMMEDIATE語句可以在運行時組裝補償操作。代碼段第11行至14行,計算出表的列數(shù),并存儲于cohimn_iiUmber。代碼段第19行至28行,使用游標(biāo)遍歷all—tab_columns表。all—tab—columns是數(shù)據(jù)庫系統(tǒng)存儲所有表列信息的表。把table—name表的所有列名連接為字符串,并存儲于cohimn一immes。代碼段第36行至71行,CREATEORREPLACETRIGGERdelete—trigger—on_,創(chuàng)建觸發(fā)器,并以表名加前綴delete—trigger—on—命名。代碼段第47行至49行,獲得當(dāng)前子事務(wù)的標(biāo)識符,并存儲于current一subo代碼段第51行至54行,根據(jù)CUrrent_SUb,獲得當(dāng)前子事務(wù)的補償語句射j數(shù)。代碼段第65行至70行,根據(jù)巳獲得的信息,把補償操作存儲于數(shù)據(jù)庫中。1CREATEORREPLACEPROCEDUREcreate—delete—trigger(2table_nameINVARCHAR2)AS3column—numberINTEGER;4column—namesVARCHAR2(300):=',;5column—薩es2VARC臓2(300):=',;6column—nameVARCHAR2(30);7iINTEGER:8TYPEcursor—typeISREFCURSOR;9column—cursorcursor—type;10BEGIN11EXECUTEIMMEDIATE'SELECTCOUNT(*)'12II'FROMall—tab—columns'13II'WHEREtable—name=UPPER("'||table—name||'")'14INTOcolumn—number;1516EXECUTEIMMEDIATE'ANALYZETABLE'||table—name||'VALIDATE17STRUCTURE';1819OPENcolumn—cursorFOR'SELECTcolumn_name'20II'F腿all—tab—columns'21II'WHEREtable—name=UPPER('"||table—name||'")';22FORiIN2..column—numberLOOP23FETCHcolumn—cursor24INTOcolumn—name;25column—names:=column_namesH,old.'||column—n咖eM',2627column—names2:=column—naraes2||column_namei|',':28ENDLOOP;2930FETCHcolumn—cursor31INTOcolumn—name;32column—names:=column—names||':old.'||column—name;33column—names2:=column—names2|1column—name;34(X0SEcolumn—cursor;3536EXECUTEIMMEDIATE'CREATEORREPLACETRIGGERdelete_trigger—on—'37IItable—nameII''38II'AFTERDELETE'39II'ON'Iitable—name||''40M'FOREACHROW'41II'DECLARE'42II'current—sub—idINTEGER;'43II'current—sub—countINTEGER;'<table>tableseeoriginaldocumentpage14</column></row><table>~~步驟二,補償事務(wù)產(chǎn)生器始終監(jiān)視著子事務(wù)的執(zhí)行過程中影響系統(tǒng)狀態(tài)的事件,當(dāng)影響系統(tǒng)狀態(tài)的事件發(fā)生時,補償事務(wù)產(chǎn)生器根據(jù)事件的類型調(diào)用相應(yīng)的行級觸發(fā)器;所述的補償事務(wù)產(chǎn)生器,是指用于動態(tài)產(chǎn)生補償事務(wù)的模塊,包括三個行級觸發(fā)器。補償事務(wù)產(chǎn)生器在子事務(wù)從開始到被確認(rèn)或撤銷的整個過程中,補償事務(wù)產(chǎn)生器監(jiān)視各種影響系統(tǒng)狀態(tài)的事件;當(dāng)影響系統(tǒng)狀態(tài)的事件出現(xiàn)時,補償事務(wù)產(chǎn)生器執(zhí)行相應(yīng)動作對于事務(wù)上下文消息,記錄全局事務(wù)標(biāo)識符和輸入?yún)?shù);預(yù)提交消息表示事務(wù)中包含的數(shù)據(jù)修改操作開始被執(zhí)行,因此,補償事務(wù)產(chǎn)生器開始根據(jù)子事務(wù)中數(shù)據(jù)修改操作的類型調(diào)用相應(yīng)的行級觸發(fā)器,自動產(chǎn)生數(shù)據(jù)修改事件的補償操作,并在子事務(wù)成功提交后使用定界符將補償操作封裝成補償事務(wù),然后存儲在數(shù)據(jù)庫中;對于撤銷消息,調(diào)用存儲在數(shù)據(jù)庫中的補償事務(wù);對于確認(rèn)消息,刪除存儲在數(shù)據(jù)庫中的補償事務(wù)。網(wǎng)格長事務(wù)由多個子事務(wù)組成,分別由處于不同網(wǎng)絡(luò)節(jié)點上的網(wǎng)格服務(wù)來完成,補償事務(wù)產(chǎn)生器被安裝于實際執(zhí)行子事務(wù)的每一個網(wǎng)格服務(wù)上。所述的影響系統(tǒng)狀態(tài)的事件,是指改變事務(wù)處理系統(tǒng)狀態(tài)的各種外部操作事件,有三大類事務(wù)協(xié)調(diào)事件、數(shù)據(jù)修改事件和服務(wù)自定義事件。所述事務(wù)協(xié)調(diào)事件是指子事務(wù)從協(xié)調(diào)者收到了事務(wù)協(xié)調(diào)消息,包括事務(wù)上下文消息、預(yù)提交消息、撤銷消息、確認(rèn)消息,所述事務(wù)上下文消息用于協(xié)調(diào)者通知參加者事務(wù)開始、事務(wù)標(biāo)識符、事務(wù)類型、協(xié)調(diào)者網(wǎng)絡(luò)地址、事務(wù)執(zhí)行有效期等信息;所述預(yù)提交消息用于協(xié)調(diào)者通知參加者提交;所述確認(rèn)和撤銷消息分別用于用戶確認(rèn)和撤消已經(jīng)提交的子事務(wù)。所述數(shù)據(jù)修改事件是指子事務(wù)中包含的改變數(shù)據(jù)庫中數(shù)據(jù)的操作,本實施例針對關(guān)系型數(shù)據(jù)庫,因而數(shù)據(jù)修改操作包括插入(insert)、刪除(delete)和更新(update)。所述服務(wù)自定義事件是指網(wǎng)格服務(wù)提供者根據(jù)自身需要設(shè)置的特殊要求,如對撤銷訂單的用戶收到一定的違約金。所述的行級觸發(fā)器,是指基于數(shù)據(jù)庫的觸發(fā)器機制創(chuàng)建的針對數(shù)據(jù)修改事件而產(chǎn)生語義相反的補償操作的三個存儲過程模塊,分別用于補償更新、插入、刪除三種語句,動態(tài)產(chǎn)生相應(yīng)數(shù)據(jù)修改事件的補償操作。行級觸發(fā)器根據(jù)數(shù)據(jù)表中行的標(biāo)識符對被修改的所有行進(jìn)行補償,不需要逐行匹配記錄,從而加快補償操作的產(chǎn)生速度,提高系統(tǒng)性能。步驟三,行級觸發(fā)器動態(tài)產(chǎn)生補償操作;當(dāng)數(shù)據(jù)修改事件出現(xiàn)時,補償事務(wù)產(chǎn)生器根據(jù)事件類型調(diào)用相應(yīng)的行級觸發(fā)器,行級觸發(fā)器生成具體的補償操作,補償操作是在子事務(wù)的執(zhí)行過程中動態(tài)產(chǎn)生的,假如子事務(wù)失敗了,則在該子事務(wù)執(zhí)行過程中所產(chǎn)生的所有補償操作也被放棄。行級觸發(fā)器在被觸發(fā)時能獲知被修改行的唯一標(biāo)識符,這些標(biāo)識符在子事務(wù)中一個操作修改多行時,可以方便地為所有被修改行產(chǎn)生相應(yīng)的補償操作。例如,若一條更新語句更新了兩行,則在更新每行時,行級觸發(fā)器都被觸發(fā)一次,從而獲得當(dāng)前正在被更新行的唯一標(biāo)識符,補償事務(wù)產(chǎn)生器接收到行級觸發(fā)器被觸發(fā)的信息,并為該行產(chǎn)生一條更新補償操作。當(dāng)以插入操作為條件的行級觸發(fā)器被觸發(fā)時,需要把被插入行的標(biāo)識符、補償操作類型(即刪除)、數(shù)據(jù)表名記錄下來;當(dāng)以更新操作為條件的行級觸發(fā)器被觸發(fā)時,則不僅要存儲被更新行的標(biāo)識符、補償操作類型(即更新)、數(shù)據(jù)表名,還要建一張結(jié)構(gòu)與原表相同的數(shù)據(jù)表,存儲被更新行的原值,以備執(zhí)行補償時使用;當(dāng)以刪除操作為條件的行級觸發(fā)器被觸發(fā)時,不僅要存儲補償操作類型(即插入)、數(shù)據(jù)表名,還要建一張結(jié)構(gòu)與原表相同的數(shù)據(jù)表,存儲被刪除行的原值,以備執(zhí)行補償時使用。另外,被刪除行的標(biāo)識符也必須存儲,以備執(zhí)行補償時,查找其它補償操作中對這個標(biāo)識符的引用,并對其進(jìn)行更新。在插入事件出現(xiàn)時,產(chǎn)生相應(yīng)的刪除語句將插入的記錄刪除;在刪除事件出現(xiàn)時,產(chǎn)生相應(yīng)的插入語句將刪除的記錄再次插入;在更新事件出現(xiàn)時,需要將被改變的記錄恢復(fù)成更新前的數(shù)據(jù)。在產(chǎn)生補償操作的過程中,行級觸發(fā)器通過數(shù)據(jù)表的結(jié)構(gòu)信息,判斷字段的數(shù)據(jù)類型;使用字符串拼接的方式,動態(tài)產(chǎn)生補償操作。對于不同的數(shù)據(jù)類型,處理方式有所不同對數(shù)值型的數(shù)據(jù),直接與補償操作片斷的字符常量連接;對字符串型的數(shù)據(jù),則需要在這個值之前和之后,分別拼接一個單引號,作為補償操作中字符串直接量的開始與中止符;對日期時間型的數(shù)據(jù),需要首先將值轉(zhuǎn)化為字符串,然后在產(chǎn)生的補償操作中利用TO—DATE函數(shù)將字符串值重新轉(zhuǎn)換為日期時間。所述的補償操作,其產(chǎn)生是由事件驅(qū)動的,根據(jù)正在執(zhí)行的語句類型,以該語句為觸發(fā)條件的行級觸發(fā)器被觸發(fā),產(chǎn)生另一條起抵消作用的補償語句。例如,當(dāng)某子事務(wù)刪除一個數(shù)據(jù)元素時,刪除事件產(chǎn)生補償操作onDdstedocompensationOperation('Insert',data)根據(jù)這個原則,子事務(wù)中的每一個delete操作將導(dǎo)致一次插入被刪除的數(shù)據(jù)元素的補償操作。函數(shù)compensationOperation可以被任何嵌入在商務(wù)邏輯中用于補償?shù)墓δ苣K所替代。所述的補償操作記錄在數(shù)據(jù)庫中,多個并發(fā)事務(wù)產(chǎn)生的補償操作存放在同一張表中,相互之間用事務(wù)標(biāo)識符加以區(qū)分,對于同一個全局事務(wù)的多個子事務(wù),如果訪問同一站點的不同服務(wù),它們的補償操作有可能被記錄在同一個關(guān)系數(shù)據(jù)庫中,因此,可以使用全局事務(wù)標(biāo)識符和執(zhí)行子事務(wù)的網(wǎng)格服務(wù)名的組合加以唯一區(qū)分。記錄補償操作的表結(jié)構(gòu)如表3所示。表3記錄補償操作的表結(jié)構(gòu)<table>tableseeoriginaldocumentpage17</column></row><table>所述的補償操作與原事務(wù)的執(zhí)行順序相反。因此,在記錄補償操作時,還需要附加一個序列號,指示此補償操作產(chǎn)生的先后順序,使得后產(chǎn)生的補償操作先執(zhí)行,先產(chǎn)生的補償操作后執(zhí)行。這個序列號可以是時間戳,或是從一個序列中選擇的遞增的序列號。所述的產(chǎn)生補償操作的行級觸發(fā)器、記錄補償操作的數(shù)據(jù)庫、以及遞增的序列號,這些關(guān)系數(shù)據(jù)庫對象均通過存儲過程來創(chuàng)建。通過提供一個COMP一OP—PKG(補償操作包),提供3個存儲過程用于創(chuàng)建這3種對象,這些存儲過程如表4所示。表4包C0MP_0P—PKG(補償操作包)提供的存儲過程<table>tableseeoriginaldocumentpage17</column></row><table>步驟四,自動產(chǎn)生補償事務(wù)如果子事務(wù)提交成功,補償事務(wù)產(chǎn)生器將產(chǎn)生的補償操作封裝在開始(Begin)和提交(Commit)之間,構(gòu)成一個完整的事務(wù),新產(chǎn)生的補償事務(wù)被存儲在數(shù)據(jù)庫中,在需要時執(zhí)行補償事務(wù);如果子事務(wù)提交失敗,所有產(chǎn)生的補償操作都將被放棄,當(dāng)下一個事務(wù)執(zhí)行時,產(chǎn)生的補償操作屬于另一個補償事務(wù)。步驟五,執(zhí)行補償事務(wù)當(dāng)補償事務(wù)自動產(chǎn)生之后,補償事務(wù)在用戶發(fā)出撤消子事務(wù)消息或超過時限子事務(wù)仍未被確認(rèn)時執(zhí)行,在需要執(zhí)行補償事務(wù)時,如圖2所示,首先通過url(網(wǎng)絡(luò)地址)、username(用戶名)、password(用戶密碼)和compOpTb(記錄補償操作的數(shù)據(jù)表名)實例化CTExecuter(補償事務(wù)執(zhí)行)類,在得到補償事務(wù)執(zhí)行類的實例后,以子事務(wù)標(biāo)識符作為輸入?yún)?shù),調(diào)用其executeCT(執(zhí)行補償事務(wù))方法即可執(zhí)行補償事務(wù),執(zhí)行補償事務(wù)時需要的子事務(wù)標(biāo)識符由子事務(wù)所屬的全局事務(wù)的標(biāo)識符以及執(zhí)行子事務(wù)的網(wǎng)格服務(wù)名稱所組成,執(zhí)行補償事務(wù)方法根據(jù)此子事務(wù)標(biāo)識符,從記錄補償操作語句的表中,將補償操作按序列號順序取出,然后在一個事務(wù)中執(zhí)行并提交。本實施例支持網(wǎng)格環(huán)境下補償事務(wù)的自動產(chǎn)生,可以縮短和減少網(wǎng)格長事務(wù)應(yīng)用的開發(fā)周期和工作量近50%,便于用戶對事務(wù)提交結(jié)果的選擇。權(quán)利要求1、一種基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征在于,包括如下步驟首先創(chuàng)建針對數(shù)據(jù)修改事件產(chǎn)生補償操作的行級觸發(fā)器,然后由補償事務(wù)產(chǎn)生器始終監(jiān)視著子事務(wù)的執(zhí)行;其次當(dāng)影響系統(tǒng)狀態(tài)的事件發(fā)生時,補償事務(wù)產(chǎn)生器根據(jù)事件的類型調(diào)用相應(yīng)的行級觸發(fā)器,自動產(chǎn)生從語義上撤銷該事件影響的補償操作;最后,當(dāng)子事務(wù)提交時,補償事務(wù)產(chǎn)生器將該子事務(wù)執(zhí)行過程中所產(chǎn)生的補償操作組合成補償事務(wù),完成自動產(chǎn)生補償事務(wù)。2、根據(jù)權(quán)利要求l所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述的行級觸發(fā)器,是指基于數(shù)據(jù)庫的觸發(fā)器機制創(chuàng)建的針對數(shù)據(jù)修改事件而產(chǎn)生語義相反的補償操作的三個存儲過程模塊,分別用于補償更新、插入、刪除三種語句,動態(tài)產(chǎn)生相應(yīng)數(shù)據(jù)修改事件的補償操作,行級觸發(fā)器根據(jù)數(shù)據(jù)表中行的標(biāo)識符對被修改的所有行進(jìn)行補償,不需要逐行匹配記錄。3、根據(jù)權(quán)利要求1或2所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述行級觸發(fā)器,其創(chuàng)建需要提供數(shù)據(jù)表的名字,根據(jù)名字從用戶表視圖中獲得數(shù)據(jù)表的結(jié)構(gòu)信息,包括所有字段名稱以及字段的數(shù)據(jù)類型,因為數(shù)據(jù)庫的USER—TAB—COLUMNS視圖提供了靜態(tài)數(shù)據(jù)詞典視圖,靜態(tài)數(shù)據(jù)詞典視圖描述了視圖的相關(guān)結(jié)構(gòu)信息,每個數(shù)據(jù)表產(chǎn)生插入行級觸發(fā)器,更新行級觸發(fā)器,刪除行級觸發(fā)器三個存儲過程模塊,即三個行級觸發(fā)器,它們分別用于補償插入、更新、刪除語句,三個行級觸發(fā)器的輸入?yún)?shù)都是其服務(wù)的數(shù)據(jù)表名稱,當(dāng)被調(diào)用時,它們產(chǎn)生補償插入、更新、刪除的補償操作。4、根據(jù)權(quán)利要求1或2所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述行級觸發(fā)器,當(dāng)數(shù)據(jù)修改事件出現(xiàn)時,補償事務(wù)產(chǎn)生器根據(jù)事件類型調(diào)用相應(yīng)的行級觸發(fā)器,行級觸發(fā)器生成具體的補償操作,補償操作是在子事務(wù)的執(zhí)行過程中動態(tài)產(chǎn)生的,假如子事務(wù)失敗了,則在該子事務(wù)執(zhí)行過程中所產(chǎn)生的所有補償操作也被放棄;其動態(tài)產(chǎn)生數(shù)據(jù)修改事件的補償操作具體是指在插入事件出現(xiàn)時,行級觸發(fā)器產(chǎn)生相應(yīng)的刪除語句將插入的記錄刪除;在刪除事件出現(xiàn)時,行級觸發(fā)器產(chǎn)生相應(yīng)的插入語句將刪除的記錄再次插入;在更新事件出現(xiàn)時,行級觸發(fā)器將被改變的記錄恢復(fù)成更新前的數(shù)據(jù),在產(chǎn)生補償操作的過程中,行級觸發(fā)器通過數(shù)據(jù)表的結(jié)構(gòu)信息,判斷字段的數(shù)據(jù)類型;使用字符串拼接的方式,動態(tài)產(chǎn)生補償操作,對于不同的數(shù)據(jù)類型,處理方式有所不同對數(shù)值型的數(shù)據(jù),直接與補償操作片斷的字符常量連接;對字符串型的數(shù)據(jù),則需要在這個值之前和之后,分別拼接一個單引號,作為補償操作中字符串直接量的開始與中止符;對日期時間型的數(shù)據(jù),需要首先將值轉(zhuǎn)化為字符串,然后在產(chǎn)生的補償操作中利用T(U)ATE函數(shù)將字符串值重新轉(zhuǎn)換為日期時間。5、根據(jù)權(quán)利要求l所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述的補償事務(wù)產(chǎn)生器,是指用于動態(tài)產(chǎn)生補償事務(wù)包括三個行級觸發(fā)器的模塊,補償事務(wù)產(chǎn)生器在子事務(wù)從開始到被確認(rèn)或撤銷的整個過程中,補償事務(wù)產(chǎn)生器監(jiān)視各種影響系統(tǒng)狀態(tài)的事件;當(dāng)影響系統(tǒng)狀態(tài)的事件出現(xiàn)時,補償事務(wù)產(chǎn)生器執(zhí)行相應(yīng)動作對于事務(wù)上下文消息,記錄全局事務(wù)標(biāo)識符和輸入?yún)?shù);預(yù)提交消息表示事務(wù)中包含的數(shù)據(jù)修改操作開始被執(zhí)行,因此,補償事務(wù)產(chǎn)生器開始根據(jù)子事務(wù)中數(shù)據(jù)修改操作的類型調(diào)用相應(yīng)的行級觸發(fā)器,自動產(chǎn)生數(shù)據(jù)修改事件的補償操作,并在子事務(wù)成功提交后使用定界符將補償操作封裝成補償事務(wù),然后存儲在數(shù)據(jù)庫中;對于撤銷消息,調(diào)用存儲在數(shù)據(jù)庫中的補償事務(wù);對于確認(rèn)消息,刪除存儲在數(shù)據(jù)庫中的補償事務(wù),網(wǎng)格長事務(wù)由多個子事務(wù)組成,分別由處于不同網(wǎng)絡(luò)節(jié)點上的網(wǎng)格服務(wù)來完成,補償事務(wù)產(chǎn)生器被安裝于實際執(zhí)行子事務(wù)的每一個網(wǎng)格服務(wù)上。6、根據(jù)權(quán)利要求l所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述的影響系統(tǒng)狀態(tài)的事件,是指改變事務(wù)處理系統(tǒng)狀態(tài)的各種外部操作事件,有三大類事務(wù)協(xié)調(diào)事件、數(shù)據(jù)修改事件和服務(wù)自定義事件,所述事務(wù)協(xié)調(diào)事件是指子事務(wù)從協(xié)調(diào)者收到了事務(wù)協(xié)調(diào)消息,包括事務(wù)上下文消息、預(yù)提交消息、撤銷消息、確認(rèn)消息,所述事務(wù)上下文消息用于協(xié)調(diào)者通知參加者事務(wù)開始、事務(wù)標(biāo)識符、事務(wù)類型、協(xié)調(diào)者網(wǎng)絡(luò)地址、事務(wù)執(zhí)行有效期信息;所述預(yù)提交消息用于協(xié)調(diào)者通知參加者執(zhí)行與提交子事務(wù);所述確認(rèn)和撤銷消息分別用于用戶確認(rèn)和撤消己經(jīng)提交的子事務(wù);所述數(shù)據(jù)修改事件是指子事務(wù)中包含的改變數(shù)據(jù)庫中數(shù)據(jù)的操作,數(shù)據(jù)修改操作包括插入、刪除和更新;所述服務(wù)自定義事件是指網(wǎng)格服務(wù)提供者根據(jù)自身需要設(shè)置的特殊要求。7、根據(jù)權(quán)利要求l所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述補償操作,其產(chǎn)生是由事件驅(qū)動的,根據(jù)正在執(zhí)行的語句類型,以該語句為觸發(fā)條件的行級觸發(fā)器被補償事務(wù)產(chǎn)生器所調(diào)用,動態(tài)產(chǎn)生另一條起抵消作用的補償操作;所述的補償操作記錄在數(shù)據(jù)庫中,多個并發(fā)事務(wù)產(chǎn)生的補償操作存放在同一張表中,相互之間用事務(wù)標(biāo)識符加以區(qū)分,對于同一個全局事務(wù)的多個子事務(wù),當(dāng)訪問同一站點的不同服務(wù)時,它們的補償操作在同一個記錄補償操作的數(shù)據(jù)庫中,因此使用全局事務(wù)標(biāo)識符和執(zhí)行子事務(wù)的網(wǎng)格服務(wù)名的組合加以唯一區(qū)分;所述的補償操作與原事務(wù)的執(zhí)行順序相反,在記錄補償操作時,附加一個序列號,指示此補償操作產(chǎn)生的先后順序,使得后產(chǎn)生的補償操作先執(zhí)行,先產(chǎn)生的補償操作后執(zhí)行,這個序列號是時間戳,或是從一個序列中選擇的遞增的序列號。8、根據(jù)權(quán)利要求7所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述產(chǎn)生補償操作的行級觸發(fā)器、記錄補償操作的數(shù)據(jù)庫、以及遞增的序列號,這些數(shù)據(jù)庫對象均通過存儲過程來創(chuàng)建,通過提供一個補償操作包,提供3個存儲過程用于創(chuàng)建這3種對象。9、根據(jù)權(quán)利要求l所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,所述自動產(chǎn)生補償事務(wù),是指如果子事務(wù)提交成功,補償事務(wù)產(chǎn)生器將產(chǎn)生的補償操作封裝在開始和提交之間,構(gòu)成一個完整的事務(wù),新產(chǎn)生的補償事務(wù)被存儲在數(shù)據(jù)庫中,在需要時執(zhí)行補償事務(wù);如果子事務(wù)提交失敗,所有產(chǎn)生的補償操作都將被放棄,當(dāng)下一個事務(wù)執(zhí)行時,產(chǎn)生的補償操作屬于另一個補償事務(wù)。10、根據(jù)權(quán)利要求l所述的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,其特征是,當(dāng)補償事務(wù)自動產(chǎn)生之后,執(zhí)行補償事務(wù),補償事務(wù)在用戶發(fā)出撤消子事務(wù)消息或超過時限子事務(wù)仍未被確認(rèn)時執(zhí)行,在需要執(zhí)行補償事務(wù)時,首先通過網(wǎng)絡(luò)地址、用戶名、用戶密碼和記錄補償操作的數(shù)據(jù)表名實例化補償事務(wù)執(zhí)行類,在得到補償事務(wù)執(zhí)行類的實例后,以子事務(wù)標(biāo)識符作為輸入?yún)?shù),調(diào)用其執(zhí)行補償事務(wù)方法即可執(zhí)行補償事務(wù),執(zhí)行補償事務(wù)時需要的子事務(wù)標(biāo)識符由子事務(wù)所屬的全局事務(wù)的標(biāo)識符以及執(zhí)行子事務(wù)的網(wǎng)格服務(wù)名稱所組成,執(zhí)行補償事務(wù)方法根據(jù)此子事務(wù)標(biāo)識符,從記錄補償操作語句的表中,將補償操作按序列號順序取出,然后在一個事務(wù)中執(zhí)行并提交。全文摘要一種計算機應(yīng)用領(lǐng)域的基于網(wǎng)格的補償事務(wù)自動產(chǎn)生方法,首先創(chuàng)建針對數(shù)據(jù)修改事件產(chǎn)生補償操作的行級觸發(fā)器,然后由補償事務(wù)產(chǎn)生器始終監(jiān)視著子事務(wù)的執(zhí)行;其次當(dāng)影響系統(tǒng)狀態(tài)的事件發(fā)生時,補償事務(wù)產(chǎn)生器根據(jù)事件的類型調(diào)用相應(yīng)的行級觸發(fā)器,自動產(chǎn)生從語義上撤銷該事件影響的補償操作;最后,當(dāng)子事務(wù)提交時,補償事務(wù)產(chǎn)生器將該子事務(wù)執(zhí)行過程中所產(chǎn)生的補償操作組合成補償事務(wù),完成自動產(chǎn)生補償事務(wù)。本發(fā)明的方法支持網(wǎng)格環(huán)境下補償事務(wù)的自動產(chǎn)生,減少網(wǎng)格長事務(wù)應(yīng)用的開發(fā)工作量和開發(fā)周期近50%。文檔編號G06F17/30GK101118501SQ20071004562公開日2008年2月6日申請日期2007年9月6日優(yōu)先權(quán)日2007年9月6日發(fā)明者唐飛龍,李明祿,過敏意申請人:上海交通大學(xué)