亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置和方法

文檔序號(hào):6433810閱讀:174來(lái)源:國(guó)知局
專利名稱:保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置和方法
技術(shù)領(lǐng)域
本發(fā)明涉及同步技術(shù)領(lǐng)域,具體而言,涉及保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置和方法。
背景技術(shù)
在當(dāng)前的企業(yè)級(jí)分布式生產(chǎn)環(huán)境中,多個(gè)數(shù)據(jù)源的使用在保持高效率、高可用的同時(shí)也帶來(lái)了如何保證跨數(shù)據(jù)源的全局事務(wù)的操作結(jié)果一致性問(wèn)題。目前主流的解決方案一般是利用獨(dú)立的事務(wù)管理器,使用XA協(xié)議的兩階段提交過(guò)程來(lái)保證其一致性(詳請(qǐng)參見(jiàn) Χ/0ΡΕΝ組織定義的XA規(guī)范)。但XA協(xié)議有以下的弊端1.使用XA協(xié)議實(shí)現(xiàn)的事務(wù)本身要用到數(shù)據(jù)源的一些關(guān)鍵資源,這使得對(duì)數(shù)據(jù)源的性能有一定的影響。2.根據(jù)XA規(guī)范,XA協(xié)議在預(yù)提交成功后會(huì)要求數(shù)據(jù)源鎖定本事務(wù)相關(guān)的資源;直到第二階段(真正的提交或者回滾)完成,相關(guān)資源的鎖才會(huì)被釋放。一旦在第二階段異常,在事務(wù)完成前的很長(zhǎng)一段時(shí)間里被鎖定的資源將會(huì)不可訪問(wèn),這在很多客戶現(xiàn)場(chǎng)是不可接受的。3.這種鎖是一種“硬鎖”——即使連接斷掉、數(shù)據(jù)庫(kù)實(shí)例甚至整個(gè)機(jī)器重新啟動(dòng)該鎖都不會(huì)釋放,這對(duì)某些數(shù)據(jù)訪問(wèn)實(shí)時(shí)性要求很高的系統(tǒng)是不合適的。從以上描述不難看出使用XA協(xié)議做分布式的事務(wù)管理的種種弊端,在一些特定的情況下可能因?yàn)閷?duì)資源的鎖定會(huì)造成一時(shí)間事務(wù)相關(guān)的數(shù)據(jù)不可訪問(wèn),從而給客戶以很差的使用體驗(yàn)。因此,如何在不使用XA協(xié)議的情況下保證跨數(shù)據(jù)源的分布式全局事務(wù)的一致性, 是需要解決的問(wèn)題。

發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題在于,提供一種數(shù)據(jù)同步技術(shù),可以在不使用XA協(xié)議的情況下保證跨數(shù)據(jù)源的分布式全局事務(wù)的一致性。根據(jù)本發(fā)明的一個(gè)方面,提供了一種保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置,包括 消息處理單元,請(qǐng)求打開(kāi)消息中間件的本地事務(wù),接收來(lái)自所述消息中間件的指定列隊(duì)中的消息,根據(jù)所述消息向全局事務(wù)控制單元發(fā)送創(chuàng)建一個(gè)全局事務(wù)的第一請(qǐng)求以及在接收到來(lái)自應(yīng)用服務(wù)單元返回的處理結(jié)果時(shí),向所述全局事務(wù)控制單元發(fā)送發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程的第二請(qǐng)求以及在接收到來(lái)自所述全局事務(wù)單元的命令時(shí),提交或者回滾所述消息中間件的本地事務(wù),所述消息中間件的本地事務(wù)為在所述消息中間件上運(yùn)行的事務(wù),所述消息中間件為第一數(shù)據(jù)源;所述全局事務(wù)控制單元,在接收到來(lái)自所述消息處理單元的所述第一請(qǐng)求時(shí),創(chuàng)建一個(gè)所述全局事務(wù),開(kāi)始第二數(shù)據(jù)源的本地事務(wù)以及在接收到來(lái)自所述消息單元的所述第二請(qǐng)求時(shí),發(fā)起提交所述全局事務(wù)的過(guò)程,先提交所述第二數(shù)據(jù)源的本地事務(wù),然后命令所述消息處理單元提交所述消息中間件的本地事務(wù),以完成所述全局事務(wù)的提交或者回滾過(guò)程,所述全局事務(wù)提交或者回滾成功后,釋放所述全局事務(wù)的相關(guān)資源,所述全局事務(wù)為跨所述第一數(shù)據(jù)源和所述第二數(shù)據(jù)源運(yùn)行的事務(wù),所述第二數(shù)據(jù)源的本地事務(wù)為在所述第二數(shù)據(jù)源上運(yùn)行的事務(wù);所述應(yīng)用服務(wù)單元,根據(jù)所述消息的業(yè)務(wù)處理需要從所述第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在所述業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至所述第二數(shù)據(jù)源,將所述處理結(jié)果返回至所述消息處理單元。
在上述技術(shù)方案中,優(yōu)選地,所述消息單元還用于在接收到所述消息時(shí),請(qǐng)求所述全局事務(wù)控制單元查看所述消息是否為第一次處理的消息以及接收來(lái)自所述全局事務(wù)單元的所述全局事務(wù)的標(biāo)識(shí)并將所述標(biāo)識(shí)發(fā)送至所述應(yīng)用單元;所述全局事務(wù)單元還用于在確定所述消息為第一次處理時(shí),請(qǐng)求為創(chuàng)建的所述全局事務(wù)分配相應(yīng)的標(biāo)識(shí),并將所述標(biāo)識(shí)發(fā)送至所述消息單元,在確定所述消息不是第一次被處理時(shí),根據(jù)恢復(fù)出來(lái)的對(duì)應(yīng)的所述全局事務(wù)的狀態(tài)繼續(xù)處理所述消息。 在上述技術(shù)方案中,優(yōu)選地,所述全局事務(wù)控制單元包括狀態(tài)修改模塊,在所述應(yīng)用服務(wù)單元處理所述消息之前,設(shè)置所述全局事務(wù)的狀態(tài)為正在進(jìn)行業(yè)務(wù)處理狀態(tài),在進(jìn)行所述消息的處理過(guò)程時(shí),將所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)以及在發(fā)起提交所述全局事務(wù)的過(guò)程時(shí),修改所述全局事務(wù)的狀態(tài)為正在提交狀態(tài),修改所述消息中間件的本地事務(wù)的狀態(tài)為正在提交狀態(tài),預(yù)先修改所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)為提交完成狀態(tài),當(dāng)監(jiān)控到所述第二數(shù)據(jù)源的本地事務(wù)和所述消息中間件的本地事務(wù)均提交完成時(shí),先修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài),然后修改所述全局事務(wù)的狀態(tài)為提交完成狀態(tài),釋放所述全局事務(wù)的相關(guān)資源。在上述技術(shù)方案中,優(yōu)選地,所述全局事務(wù)控制單元還可以包括恢復(fù)模塊,在提交所述第二數(shù)據(jù)源的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,系統(tǒng)恢復(fù)后,所述應(yīng)用服務(wù)單元將重新處理所述消息,在提交所述消息中間件的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,在系統(tǒng)恢復(fù)后,所述應(yīng)用服務(wù)單元將重新處理該消息,而由于針對(duì)本消息的第二數(shù)據(jù)源處理已經(jīng)完成(通過(guò)激烈的本地事務(wù)狀態(tài)可以查詢),所以處理結(jié)束后只要?jiǎng)h除所述消息就行以及在修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài)之前,若出現(xiàn)異常并重新啟動(dòng),則在所述消息中間件中刪除所述消息。在上述技術(shù)方案中,優(yōu)選地,所述全局事務(wù)控制單元還可以包括控制模塊,在所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)時(shí),允許在所述全局事務(wù)中加入其它數(shù)據(jù)源的本地事務(wù),在所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均提交完成狀態(tài)時(shí),不允許在所述全局事務(wù)中加入所述其它數(shù)據(jù)源的本地事務(wù);所述消息中間件的本地事務(wù)的狀態(tài)信息、所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)信息以及所述全局事務(wù)的狀態(tài)信息保存在所述第二數(shù)據(jù)源中,所述第二數(shù)據(jù)源為數(shù)據(jù)庫(kù)數(shù)據(jù)源。通過(guò)上述技術(shù)方案,可以使用非XA協(xié)議方式來(lái)保證跨數(shù)據(jù)源的數(shù)據(jù)操作結(jié)果一致性——利用保存在第二數(shù)據(jù)源里的全局事務(wù)的狀態(tài),來(lái)雙向核對(duì)DBMS (第二數(shù)據(jù)源)和 MOM(消息中間件,第一數(shù)據(jù)源)這兩類數(shù)據(jù)源,通過(guò)絕對(duì)的狀態(tài)控制來(lái)保證事務(wù)業(yè)務(wù)處理的操作結(jié)果一致性。根據(jù)本發(fā)明的又一方面,還提供了一種保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,包括步驟602,打開(kāi)消息中間件的本地事務(wù),當(dāng)接收到來(lái)自所述消息中間件的指定列隊(duì)中的消息時(shí),根據(jù)所述消息創(chuàng)建一個(gè)全局事務(wù),開(kāi)始第二數(shù)據(jù)源的本地事務(wù),其中,所述消息中間件為第一數(shù)據(jù)源,所述消息中間件的本地事務(wù)為在所述消息中間件上運(yùn)行的事務(wù),所述第二數(shù)據(jù)源的本地事務(wù)為在所述第二數(shù)據(jù)源上運(yùn)行的事務(wù),所述全局事務(wù)為跨所述第一數(shù)據(jù)源和所述第二數(shù)據(jù)源運(yùn)行的事務(wù);步驟604,根據(jù)所述消息的業(yè)務(wù)處理需要從所述第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在所述業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至所述第二數(shù)據(jù)源;步驟606,根據(jù)返回的所述處理結(jié)果發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程,先提交或者回滾所述第二數(shù)據(jù)源的本地事務(wù),然后提交或者回滾所述消息中間件的本地事務(wù), 以完成所述全局事務(wù)的提交或者回滾過(guò)程,所述全局事務(wù)提交或者回滾成功后,釋放所述全局事務(wù)的相關(guān)資源。在上述技術(shù)方案中,優(yōu)選地,所述步驟602還可以包括判斷所述消息是否為第一次處理的消息,若判斷出所述消息為第一次處理,則創(chuàng)建所述全局事務(wù)并請(qǐng)求為所述全局事務(wù)分配標(biāo)識(shí),根據(jù)所述標(biāo)識(shí)處理所述消息,若判斷出所述消息不是第一次被處理,則根據(jù)恢復(fù)出來(lái)的對(duì)應(yīng)的所述全局事務(wù)的狀態(tài)繼續(xù)處理所述消息。在上述技術(shù)方案中,優(yōu)選地,所述步驟602還可以包括在處理所述消息之前,設(shè)置所述全局事務(wù)的狀態(tài)為正在進(jìn)行業(yè)務(wù)處理狀態(tài),在進(jìn)行所述消息的處理過(guò)程時(shí),將所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài);所述步驟606還包括在發(fā)起提交所述全局事務(wù)的過(guò)程時(shí),修改所述全局事務(wù)的狀態(tài)為正在提交狀態(tài),修改所述消息中間件的本地事務(wù)的狀態(tài)為正在提交狀態(tài),預(yù)先修改所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)為提交完成狀態(tài),當(dāng)監(jiān)控到所述第二數(shù)據(jù)源的本地事務(wù)和所述消息中間件的本地事務(wù)均提交完成時(shí),先修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài),然后修改所述全局事務(wù)的狀態(tài)為提交完成狀態(tài),釋放所述全局事務(wù)的相關(guān)資源。在上述技術(shù)方案中,優(yōu)選地,所述步驟606還可以包括在提交所述第二數(shù)據(jù)源的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù)和所述第二數(shù)據(jù)源的本地事務(wù),所述消息回到所述消息中間件的指定列隊(duì)中,重新處理所述消息;在提交所述消息中間件的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),,將所述消息返回到所述消息中間件的指定列隊(duì)中,重新處理所述消息,處理結(jié)束后刪除所述消息;在修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài)之前,若出現(xiàn)異常并重新啟動(dòng),則在所述消息中間件中刪除所述消息。在上述技術(shù)方案中,優(yōu)選地,當(dāng)所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)時(shí),允許在所述全局事務(wù)中加入其它數(shù)據(jù)源的本地事務(wù),當(dāng)所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均提交完成狀態(tài)時(shí),不允許在所述全局事務(wù)中加入所述其它數(shù)據(jù)源的本地事務(wù),所述消息中間件的本地事務(wù)的狀態(tài)信息、所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)信息以及所述全局事務(wù)的狀態(tài)信息保存在所述第二數(shù)據(jù)源中,所述第二數(shù)據(jù)源為數(shù)據(jù)庫(kù)數(shù)據(jù)源(例如, OLTP數(shù)據(jù)源)。
通過(guò)上述技術(shù)方案,可以使用非XA協(xié)議方式來(lái)保證跨數(shù)據(jù)源的數(shù)據(jù)操作結(jié)果一致性——利用保存在第二數(shù)據(jù)源里的全局事務(wù)的狀態(tài),來(lái)雙核對(duì)DBMS (第二數(shù)據(jù)源)和 MOM(消息中間件,第一數(shù)據(jù)源)這兩類數(shù)據(jù)源,通過(guò)絕對(duì)的狀態(tài)控制來(lái)保證事務(wù)業(yè)務(wù)處理的操作結(jié)果一致性。


圖1示出了根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的系統(tǒng)的框圖;圖2示出了根據(jù)本發(fā)明的實(shí)施例的多模塊協(xié)作的時(shí)序圖;圖3示出了根據(jù)本發(fā)明的實(shí)施例的全局事務(wù)的狀態(tài)變化示意圖;圖4示出了根據(jù)本發(fā)明的實(shí)施例的全局事務(wù)中的分支狀態(tài)變化示意圖;圖5示出了根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置的框圖; 以及圖6示出了根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法的流程圖。
具體實(shí)施例方式為了能夠更清楚地理解本發(fā)明的上述目的、特征和優(yōu)點(diǎn),下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明進(jìn)行進(jìn)一步的詳細(xì)描述。在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本發(fā)明,但是,本發(fā)明還可以采用其他不同于在此描述的其他方式來(lái)實(shí)施,因此,本發(fā)明并不限于下面公開(kāi)的具體實(shí)施例的限制。在下文中出現(xiàn)的英文縮寫的說(shuō)明如下消息中間件英文名稱Message Oriented Middleware,簡(jiǎn)稱Μ0Μ,是一種構(gòu)建高效可靠的數(shù)據(jù)傳輸平臺(tái)的基礎(chǔ)軟件。數(shù)據(jù)庫(kù)管理系統(tǒng)英語(yǔ)名稱Database Management System,簡(jiǎn)稱DBMS,也是一種基礎(chǔ)軟件,主要功能是向上層應(yīng)用提供數(shù)據(jù)的可靠存儲(chǔ)和高效查詢服務(wù)。事務(wù)是一系列操作的集合,這些操作將作為一個(gè)整體參與到上層邏輯中(事務(wù)的原子性);最終的結(jié)果只有兩個(gè),要么所有操作全部生效,要么全部失敗。本地事務(wù)一般指在單個(gè)數(shù)據(jù)源上運(yùn)行的事務(wù)。全局事務(wù)一般是跨數(shù)據(jù)源或者跨系統(tǒng)的事務(wù)。事務(wù)管理器一般是跨數(shù)據(jù)源的、獨(dú)立的事務(wù)管理系統(tǒng)。其功能是維護(hù)跨數(shù)據(jù)源的全局事務(wù)(協(xié)調(diào)參與本事務(wù)的每一個(gè)數(shù)據(jù)源的本地事務(wù)),并保證其分布式環(huán)境下的結(jié)果
一致性。首先結(jié)合圖1中所示的實(shí)施例在整體上說(shuō)明根據(jù)本發(fā)明的技術(shù)方案。如圖1所示,事務(wù)管理器102作為一種中間件系統(tǒng),通過(guò)事務(wù)管理接口可以向上層應(yīng)用(應(yīng)用層)提供服務(wù);向下封裝了 DBMS (例如圖中的數(shù)據(jù)庫(kù)管理系統(tǒng)104,可以為OLTP 數(shù)據(jù)源并作為第二數(shù)據(jù)源)、Μ0Μ(例如圖中的消息中間件106,作為第一數(shù)據(jù)源)和其他的 EIS所提供的服務(wù)(位于企業(yè)信息系統(tǒng)層),為事務(wù)管理器102提供統(tǒng)一的接口。事務(wù)管理器102的核心模塊有以下三個(gè)構(gòu)成
全局事務(wù)標(biāo)識(shí)管理1022 該模塊主要負(fù)責(zé)維護(hù)全局事務(wù)標(biāo)識(shí)。為保證唯一性,將全局事務(wù)標(biāo)識(shí)信息持久化在了 DBMS中,并向其他模塊提供統(tǒng)一的調(diào)用接口。消息處理單元IOM 在多層模型中,上層應(yīng)用已經(jīng)進(jìn)化成為一個(gè)個(gè)服務(wù)并嵌入在事務(wù)管理器或者其他的中間件系統(tǒng)中運(yùn)行。消息處理單元IOM封裝了事務(wù)和JMS消息處理的相關(guān)細(xì)節(jié),根據(jù)JMS規(guī)范(詳細(xì)請(qǐng)參見(jiàn)JMS規(guī)范),應(yīng)用只要實(shí)現(xiàn)相應(yīng)的消息數(shù)據(jù)處理邏輯即可,這極大地簡(jiǎn)化了上層應(yīng)用的難度。全局事務(wù)控制單元10 該模塊主要負(fù)責(zé)全局事務(wù)的管理,并向外提供事務(wù)處理的接口,如創(chuàng)建、提交、回滾、超時(shí)監(jiān)控等。一個(gè)全局事務(wù)將包括兩個(gè)分支一個(gè)分支用于處理MOM的操作,另一個(gè)分支用于處理DBMS的操作。對(duì)全局事務(wù)的管理(包括對(duì)全局事務(wù)分支的管理)通過(guò)對(duì)全局事務(wù)的狀態(tài)維護(hù)來(lái)實(shí)現(xiàn)。實(shí)際上,全局事務(wù)的狀態(tài)就是對(duì)消息進(jìn)行業(yè)務(wù)處理的狀態(tài),為了保證全局操作的結(jié)果一致性,在設(shè)計(jì)中全局事務(wù)的信息及狀態(tài)也會(huì)被持久化到DBMS系統(tǒng)中,這樣就可以將全局事務(wù)的狀態(tài)操作和業(yè)務(wù)操作的事務(wù)進(jìn)行綁定, 從而保證消息被不重不丟的處理。通過(guò)上面的描述可以看到實(shí)現(xiàn)的過(guò)程為從MOM接收一個(gè)消息并處理這個(gè)消息, 把對(duì)應(yīng)這個(gè)消息數(shù)據(jù)的業(yè)務(wù)處理所需要的其他業(yè)務(wù)數(shù)據(jù)從DBMS里提取出來(lái),在業(yè)務(wù)邏輯處理完成后將生成的結(jié)果存儲(chǔ)到DBMS中去;但如果加入可靠性要求——在異常情況下也能保證消息被不重不丟的處理,這就需要事務(wù)管理器102通過(guò)全局事務(wù)來(lái)協(xié)調(diào)兩個(gè)數(shù)據(jù)源的本地事務(wù),以此來(lái)保證結(jié)果一致性。為了避免使用XA協(xié)議給帶來(lái)的影響,將使用雙向狀態(tài)核對(duì)機(jī)制來(lái)控制全局事務(wù)的狀態(tài)。下面將以一個(gè)多模塊協(xié)作的時(shí)序圖來(lái)描述如何實(shí)現(xiàn)使用雙向狀態(tài)核對(duì)來(lái)控制全局事務(wù)的狀態(tài)如圖2所示,1,將建立消息處理單元IOM與消息中間件106、數(shù)據(jù)庫(kù)管理系統(tǒng) 104 (第二數(shù)據(jù)源,例如OLTP數(shù)據(jù)源)、應(yīng)用服務(wù)單元108的連接;2,從數(shù)據(jù)庫(kù)管理系統(tǒng)中恢復(fù)全局事務(wù)標(biāo)識(shí)使用情況;3,從數(shù)據(jù)庫(kù)管理系統(tǒng)中恢復(fù)未完成的事務(wù)。各個(gè)模塊都初始化 (1、2和3)完成后,事務(wù)管理器102提供的消息處理單元IOM將阻塞在MOM的消息隊(duì)列上, 等待一個(gè)很新的消息請(qǐng)求到來(lái),這是觸發(fā)一個(gè)完整的事務(wù)處理流程的前提(見(jiàn)4和5)。4,消息處理單元IOM請(qǐng)求打開(kāi)一個(gè)消息中間件106的本地事務(wù);5,根據(jù)業(yè)務(wù)需要請(qǐng)求消息中間件從指定隊(duì)列中接收到消息;6,返回給消息處理單元業(yè)務(wù)對(duì)應(yīng)的消息;7,消息處理單元IOM —旦收到消息,請(qǐng)求全局事務(wù)控制單元10 查看該消息是否已經(jīng)注冊(cè)對(duì)應(yīng)的事務(wù);8,全局事務(wù)控制單元10 檢查該消息是否已經(jīng)注冊(cè)對(duì)應(yīng)的全局事務(wù)(已經(jīng)被處理過(guò)的消息);9,消息處理單元IOM收到返回查看結(jié)果;10,如果發(fā)現(xiàn)是已經(jīng)被處理過(guò)的事務(wù),根據(jù)對(duì)應(yīng)的事務(wù)的狀態(tài)決定去完成這個(gè)事務(wù),如果是第一次處理這個(gè)消息,則請(qǐng)求全局事務(wù)控制單元10 創(chuàng)建一個(gè)全局事務(wù);11,全局事務(wù)控制單元10 請(qǐng)求全局事務(wù)標(biāo)識(shí)管理單元1022給一個(gè)全局事務(wù)標(biāo)識(shí);12,全局事務(wù)標(biāo)識(shí)管理單元1022分配一個(gè)全局事務(wù)標(biāo)識(shí)給全局事務(wù)控制單元10 ;13,創(chuàng)建全局事務(wù),將該全局事務(wù)的分支(MOM和DBMS的兩個(gè)本地事務(wù))初始化。14,開(kāi)始一個(gè)第二數(shù)據(jù)源(DBMS,數(shù)據(jù)庫(kù)管理系統(tǒng))的本地事務(wù);15,創(chuàng)建事務(wù)過(guò)程結(jié)束和調(diào)用針對(duì)該消息的業(yè)務(wù)處理流程之前,將全局事務(wù)的狀態(tài)修改為正在進(jìn)行業(yè)務(wù)處理。16,全局事務(wù)控制單元10 將創(chuàng)建的全局事務(wù)的標(biāo)識(shí)傳送至消息處理單元IOM ; 17,應(yīng)用服務(wù)單元108調(diào)用業(yè)務(wù)處理邏輯處理接收到的消息;18,應(yīng)用服務(wù)單元108在處理時(shí),向第二數(shù)據(jù)源獲取業(yè)務(wù)處理需要的業(yè)務(wù)數(shù)據(jù);19,第二數(shù)據(jù)源返回應(yīng)用服務(wù)單元108需要的業(yè)務(wù)數(shù)據(jù);20,處理消息數(shù)據(jù);21,將處理結(jié)果返回至消息處理單元;22,消息處理單元 IOM接收到處理結(jié)果后,發(fā)起提交全局事務(wù)的流程;24,將全局事務(wù)的狀態(tài)修改為正在提交狀態(tài),并且將第二數(shù)據(jù)源裝的本地事務(wù)的狀態(tài)修改為已經(jīng)提交,消息中間件的本地事務(wù)的狀態(tài)修改為正在提交狀態(tài),將這些狀態(tài)信息持久化在第二數(shù)據(jù)源中;25,全局事務(wù)控制單元10 命令提交第二數(shù)據(jù)源的本地事務(wù);26,全局事務(wù)控制單元10 命令消息處理單元 1024提交消息中間件的本地事務(wù);27,消息處理單元IOM接收到指令后,提交消息中間件的本地事務(wù);28,消息中間件106返回提交成功的信息給消息處理單元;29,消息處理單元 1024通知全局事務(wù)控制單元10 消息中間件106的本地事務(wù)已經(jīng)提交成功;30,全局事務(wù)控制單元10 接收到通知后,修改消息中間件的本地事務(wù)狀態(tài)為已經(jīng)提交;31,修改全局事務(wù)狀態(tài)為已經(jīng)提交,并將這些狀態(tài)信息持久化與第二數(shù)據(jù)源中;32,到此一個(gè)從收到消息到處理的整個(gè)過(guò)程的全局事務(wù)就完成了,最后釋放全局事務(wù)的相關(guān)資源,結(jié)束本次請(qǐng)求的處理。在圖2中只給出了消息數(shù)據(jù)處理成功后全局事務(wù)提交的流程,考慮到如果消息數(shù)據(jù)處理失敗后全局事務(wù)的回滾流程和提交流程十分類似,因此將不再給出全局事務(wù)回滾的相互協(xié)作時(shí)序圖。此外,圖2里給出的是正常的業(yè)務(wù)時(shí)序圖,真正實(shí)現(xiàn)過(guò)程中對(duì)任何的異常 /失敗都要嚴(yán)格按照時(shí)序進(jìn)行回滾處理,這樣才能保證其全局事務(wù)的結(jié)果一致性。下面將詳細(xì)解釋這種系統(tǒng)是如何保證在各種異常情況下操作結(jié)果的一致性的,從時(shí)序圖里可以看到 23 32為全局事務(wù)的提交或回滾過(guò)程,接下來(lái)就針對(duì)每一個(gè)步驟假設(shè)系統(tǒng)重新啟動(dòng),是如何被恢復(fù)的。(1)在25之前系統(tǒng)異常并重新啟動(dòng)會(huì)發(fā)現(xiàn)對(duì)第二數(shù)據(jù)源執(zhí)行的所有操作所在的事務(wù),因?yàn)橄到y(tǒng)重新啟動(dòng)而被回滾掉,因此,第二數(shù)據(jù)源中將沒(méi)有任何處理該消息所對(duì)應(yīng)的事務(wù)的記錄;而該消息在消息中間件中對(duì)應(yīng)的本地事務(wù)也將回滾掉,消息又重新回到了消息中間件的隊(duì)列中;系統(tǒng)恢復(fù)后這個(gè)消息將再次被取出并進(jìn)行處理(和進(jìn)行第一次處理的過(guò)程一樣),所以這種情況不會(huì)造成任何的結(jié)果不一致。(2)在沈或27或觀之前系統(tǒng)異常并重新啟動(dòng)在消息中間件提交本地事務(wù)前系統(tǒng)異常并重新啟動(dòng),將導(dǎo)致消息中間件的本地事務(wù)(MOM分支的本地事務(wù))回滾,消息回到消息中間件的制定列隊(duì)中,按照第一次處理該消息時(shí)的流程(獲取全局事務(wù),檢查全局事務(wù)的狀態(tài)到修改全局事務(wù)的狀態(tài))重新處理該消息對(duì)應(yīng)的本地事務(wù),而此時(shí)DBMS分支的本地事務(wù)已經(jīng)提交,因此全局事務(wù)控制單元在初始化時(shí),將把該MOM消息對(duì)應(yīng)的全局事務(wù)恢復(fù)回來(lái),其全局事務(wù)的狀態(tài)為正在提交,MOM分支的狀態(tài)為正在提交,而DBMS分支的狀態(tài)為已經(jīng)提交,這表示針對(duì)這個(gè)消息數(shù)據(jù)所對(duì)應(yīng)的業(yè)務(wù)處理都已經(jīng)成功處理結(jié)束,接下來(lái)所要做的是直接從MOM中刪除這個(gè)消息并釋放全局事務(wù)的相關(guān)資源就,同樣這種情況也不會(huì)造成任何結(jié)果不一致。(3)在四或30之前系統(tǒng)異常并重新啟動(dòng)雖然在DBMS中的全局事務(wù)的狀態(tài)與上述情況一樣,但實(shí)際上MOM分支的本地事務(wù)已經(jīng)提交(被處理的消息已經(jīng)不存在),只需按正常處理那樣去刪除這個(gè)消息,然后釋放全局事務(wù)相應(yīng)的資源,這種情況也不會(huì)造成任何的結(jié)果不一致。
(4)在31之前系統(tǒng)異常并重新啟動(dòng)重新啟動(dòng)后,全局事務(wù)控制單元從DBMS中恢復(fù)事務(wù)后,其全局事務(wù)狀態(tài)為正在提交,而DBMS和MOM這兩個(gè)分支的狀態(tài)都是已經(jīng)提交完成,此時(shí)處理過(guò)程更加簡(jiǎn)單,只需修改全局事務(wù)狀態(tài)為提交完成并釋放全局事務(wù)的相關(guān)資源,這種情況下也不會(huì)有任何結(jié)果不一致。(5)在32之前系統(tǒng)異常并重新啟動(dòng)在此之前發(fā)生異常并重新啟動(dòng)系統(tǒng),全局事務(wù)控制單元從DBMS中恢復(fù)事務(wù)后,發(fā)現(xiàn)全局事務(wù)狀態(tài)已經(jīng)是提交完成,只需釋放全局事務(wù)相關(guān)的資源,這種情況下也不會(huì)有任何結(jié)果不一致。從上面的詳細(xì)描述可以看出根據(jù)本發(fā)明的技術(shù)方案雖然沒(méi)有使用XA協(xié)議,但是在任何情況都能保證全局事務(wù)所協(xié)調(diào)的MOM和DBMS這兩個(gè)數(shù)據(jù)源上本地事務(wù)的一致性。下面結(jié)合圖3說(shuō)明全局事務(wù)的狀態(tài)變化情況。如圖3所示,步驟302,全局事務(wù)的狀態(tài)以初始狀態(tài)開(kāi)始,若事務(wù)發(fā)起者主動(dòng)回滾, 則進(jìn)入步驟312,處于正在進(jìn)行分支回滾狀態(tài)。步驟304,在各個(gè)分支(例如消息中間件的本地事務(wù)、第二數(shù)據(jù)源的本地事務(wù))的業(yè)務(wù)處理階段,將各分支的狀態(tài)設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài),全局事務(wù)的狀態(tài)也為正在進(jìn)行業(yè)務(wù)處理狀態(tài),此時(shí),在全局事務(wù)中可以加入其他的分支。若進(jìn)行業(yè)務(wù)處理超時(shí),則進(jìn)入步驟312,處于正在進(jìn)行分支回滾狀態(tài)。步驟306,所有分支業(yè)務(wù)處理完成后修改全局事務(wù)的狀態(tài)為業(yè)務(wù)處理完成狀態(tài),這時(shí)不能在全局事務(wù)中加入其他的分支,若業(yè)務(wù)處理超時(shí)或失敗,則進(jìn)入步驟312,然后進(jìn)行步驟314,進(jìn)入分支回滾完成狀態(tài)。步驟308,收到來(lái)自調(diào)用者的提交事務(wù)信息后,全局事務(wù)的狀態(tài)會(huì)被修改為正在提交事務(wù)狀態(tài),并觸發(fā)各個(gè)分支的提交流程,各分支狀態(tài)為正在進(jìn)行提交狀態(tài)。步驟310, 在此期間需要監(jiān)視所有分支的狀態(tài),直到各個(gè)分支都提交完成,最后將全局事務(wù)狀態(tài)修改為全局事務(wù)提交完成狀態(tài),這樣就完成了一個(gè)全局事務(wù)的生命周期。在整個(gè)生命周期內(nèi)任何主動(dòng)發(fā)起或者失敗(比如業(yè)務(wù)失敗或者超時(shí))都可以觸發(fā)全局事務(wù)的回滾流程。下面結(jié)合圖4說(shuō)明全局事務(wù)分支的狀態(tài)變化情況。如圖4所示,是全局事務(wù)的一個(gè)分支(消息中間件的本地事務(wù)或OLTP數(shù)據(jù)源的本地事務(wù))的狀態(tài)變化示意圖,步驟402,與全局事務(wù)一樣,分支的狀態(tài)也是以初始狀態(tài)開(kāi)始。步驟404,在調(diào)用真正的業(yè)務(wù)處理流程之前其狀態(tài)會(huì)被修改為正在進(jìn)行業(yè)務(wù)處理。步驟 404,直至業(yè)務(wù)處理處理完成,分支的狀態(tài)會(huì)被相應(yīng)的修改,修改為業(yè)務(wù)處理完成狀態(tài)。接下來(lái)的狀態(tài)需要等待全局事務(wù)的觸發(fā),進(jìn)行分支提交或者回滾流程。判斷是否處理成功,如果處理成功或全局事務(wù)發(fā)起者發(fā)起提交指令,則進(jìn)入步驟408,進(jìn)入正在進(jìn)行提交狀態(tài),然后進(jìn)入步驟410,提交完成后,將分支狀態(tài)修改為提交完成狀態(tài)。若判斷處理失敗或全局事務(wù)發(fā)起者要求回滾,則進(jìn)入步驟412,進(jìn)入分支正在進(jìn)行回滾狀態(tài),然后進(jìn)入步驟414,進(jìn)入分支回滾完成狀態(tài),在提交或者回滾完成后,分支的生命周期結(jié)束。圖5示出了根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置的框圖。如圖5所示,根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置500,包括消息處理單元502,請(qǐng)求打開(kāi)消息中間件的本地事務(wù),接收來(lái)自所述消息中間件的指定列隊(duì)中的消息,根據(jù)所述消息向全局事務(wù)控制單元504發(fā)送創(chuàng)建一個(gè)全局事務(wù)的第一請(qǐng)求以及在接收到來(lái)自應(yīng)用服務(wù)單元506返回的處理結(jié)果時(shí),向所述全局事務(wù)控制單元504發(fā)送發(fā)起提交所述全局事務(wù)的過(guò)程的第二請(qǐng)求以及在接收到來(lái)自所述全局事務(wù)單元504的命令時(shí),提交所述消息中間件的本地事務(wù),所述消息中間件的本地事務(wù)為在所述消息中間件上運(yùn)行的事務(wù),所述消息中間件為第一數(shù)據(jù)源;所述全局事務(wù)控制單元504,在接收到來(lái)自所述消息處理單元502的所述第一請(qǐng)求時(shí),創(chuàng)建一個(gè)所述全局事務(wù),開(kāi)始第二數(shù)據(jù)源的本地事務(wù)以及在接收到來(lái)自所述消息單元502的所述第二請(qǐng)求時(shí),發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程,先提交或者回滾所述第二數(shù)據(jù)源的本地事務(wù),然后命令所述消息處理單元502提交或者回滾所述消息中間件的本地事務(wù),以完成所述全局事務(wù)的提交或者回滾過(guò)程,所述全局事務(wù)提交或者回滾成功后,釋放所述全局事務(wù)的相關(guān)資源,所述全局事務(wù)為跨所述第一數(shù)據(jù)源和所述第二數(shù)據(jù)源運(yùn)行的事務(wù),所述第二數(shù)據(jù)源的本地事務(wù)為在所述第二數(shù)據(jù)源上運(yùn)行的事務(wù);所述應(yīng)用服務(wù)單元506,根據(jù)所述消息的業(yè)務(wù)處理需要從所述第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在所述業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至所述第二數(shù)據(jù)源,將所述處理結(jié)果返回至所述消息處理單元502。在上述技術(shù)方案中,優(yōu)選地,所述消息單元502還用于在接收到所述消息時(shí),請(qǐng)求所述全局事務(wù)控制單元504查看所述消息是否為第一次處理的消息以及接收來(lái)自所述全局事務(wù)單元504的所述全局事務(wù)的標(biāo)識(shí)并將所述標(biāo)識(shí)發(fā)送至所述應(yīng)用單元506 ;所述全局事務(wù)單元504還用于在確定所述消息為第一次處理時(shí),請(qǐng)求為創(chuàng)建的所述全局事務(wù)分配相應(yīng)的標(biāo)識(shí),并將所述標(biāo)識(shí)發(fā)送至所述消息單元502,在確定所述消息不是第一次被處理時(shí), 根據(jù)恢復(fù)出來(lái)的對(duì)應(yīng)的所述全局事務(wù)的狀態(tài)繼續(xù)處理所述消息。在上述技術(shù)方案中,優(yōu)選地,所述全局事務(wù)控制單元504包括狀態(tài)修改模塊 5042,在所述應(yīng)用服務(wù)單元506處理所述消息之前,設(shè)置所述全局事務(wù)的狀態(tài)為正在進(jìn)行業(yè)務(wù)處理狀態(tài),在進(jìn)行所述消息的處理過(guò)程時(shí),將所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)以及在發(fā)起提交所述全局事務(wù)的過(guò)程時(shí),修改所述全局事務(wù)的狀態(tài)為正在提交狀態(tài),修改所述消息中間件的本地事務(wù)的狀態(tài)為正在提交狀態(tài),預(yù)先修改所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)為提交完成狀態(tài),當(dāng)監(jiān)控到所述第二數(shù)據(jù)源的本地事務(wù)和所述消息中間件的本地事務(wù)均提交完成時(shí),先修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài),然后修改所述全局事務(wù)的狀態(tài)為提交完成狀態(tài),釋放所述全局事務(wù)的相關(guān)資源。在上述技術(shù)方案中,優(yōu)選地,所述全局事務(wù)控制單元504還可以包括恢復(fù)模塊 5044,在提交所述第二數(shù)據(jù)源的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,系統(tǒng)恢復(fù)后,所述應(yīng)用服務(wù)單元506將重新處理所述消息,在提交所述消息中間件的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,在系統(tǒng)恢復(fù)后,將所述應(yīng)用服務(wù)單元506重新處理該消息,而由于針對(duì)本消息的第二數(shù)據(jù)源處理已經(jīng)完成(通過(guò)激烈的本地事務(wù)狀態(tài)可以查詢),所以只要在處理結(jié)束后刪除所述消息就行以及在修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài)之前,若出現(xiàn)異常并重新啟動(dòng),則在所述消息中間件中刪除所述消息。在上述技術(shù)方案中,優(yōu)選地,所述全局事務(wù)控制單元504還可以包括控制模塊 5046,在所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)時(shí),允許在所述全局事務(wù)中加入其它數(shù)據(jù)源的本地事務(wù),在所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均提交完成狀態(tài)時(shí),不允許在所述全局事務(wù)中加入所述其它數(shù)據(jù)源的本地事務(wù);所述消息中間件的本地事務(wù)的狀態(tài)信息、所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)信息以及所述全局事務(wù)的狀態(tài)信息保存在所述第二數(shù)據(jù)源中,所述第二數(shù)據(jù)源為數(shù)據(jù)庫(kù)數(shù)據(jù)源(例如,OLTP數(shù)據(jù)源)。通過(guò)上述技術(shù)方案,可以使用非XA協(xié)議方式來(lái)保證跨數(shù)據(jù)源的數(shù)據(jù)操作結(jié)果一致性——利用保存在第二數(shù)據(jù)源里的全局事務(wù)的狀態(tài),來(lái)雙核對(duì)DBMS (第二數(shù)據(jù)源)和 MOM(消息中間件,第一數(shù)據(jù)源)這兩類數(shù)據(jù)源,通過(guò)絕對(duì)的狀態(tài)控制來(lái)保證事務(wù)業(yè)務(wù)處理的操作結(jié)果一致性。圖6示出了根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法的流程圖。如圖6所示,根據(jù)本發(fā)明的實(shí)施例的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,包括 步驟602,打開(kāi)消息中間件的本地事務(wù),當(dāng)接收到來(lái)自所述消息中間件的指定列隊(duì)中的消息時(shí),根據(jù)所述消息創(chuàng)建一個(gè)全局事務(wù),命令開(kāi)始第二數(shù)據(jù)源的本地事務(wù),其中,所述消息中間件為第一數(shù)據(jù)源,所述消息中間件的本地事務(wù)為在所述消息中間件上運(yùn)行的事務(wù),所述第二數(shù)據(jù)源的本地事務(wù)為在所述第二數(shù)據(jù)源上運(yùn)行的事務(wù),所述全局事務(wù)為跨所述第一數(shù)據(jù)源和所述第二數(shù)據(jù)源運(yùn)行的事務(wù);步驟604,根據(jù)所述消息的業(yè)務(wù)處理需要從所述第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在所述業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至所述第二數(shù)據(jù)源;步驟606,根據(jù)返回的所述處理結(jié)果發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程,先提交或者回滾所述第二數(shù)據(jù)源的本地事務(wù),然后提交或者回滾所述消息中間件的本地事務(wù), 以完成所述全局事務(wù)的提交或者回滾過(guò)程,所述全局事務(wù)提交或者回滾成功后,釋放所述全局事務(wù)的相關(guān)資源。在上述技術(shù)方案中,優(yōu)選地,所述步驟602還可以包括判斷所述消息是否為第一次處理的消息,若判斷出所述消息為第一次處理,則創(chuàng)建所述全局事務(wù)并請(qǐng)求為所述全局事務(wù)分配標(biāo)識(shí),根據(jù)所述標(biāo)識(shí)處理所述消息,若判斷出所述消息不是第一次被處理,則根據(jù)恢復(fù)出來(lái)的對(duì)應(yīng)的所述全局事務(wù)的狀態(tài)繼續(xù)處理所述消息。在上述技術(shù)方案中,優(yōu)選地,所述步驟602還可以包括在處理所述消息之前,設(shè)置所述全局事務(wù)的狀態(tài)為正在進(jìn)行業(yè)務(wù)處理狀態(tài),在進(jìn)行所述消息的處理過(guò)程時(shí),將所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài);所述步驟606還包括在發(fā)起提交所述全局事務(wù)的過(guò)程時(shí),修改所述全局事務(wù)的狀態(tài)為正在提交狀態(tài),修改所述消息中間件的本地事務(wù)的狀態(tài)為正在提交狀態(tài),預(yù)先修改所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)為提交完成狀態(tài),當(dāng)監(jiān)控到所述第二數(shù)據(jù)源的本地事務(wù)和所述消息中間件的本地事務(wù)均提交完成時(shí),先修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài),然后修改所述全局事務(wù)的狀態(tài)為提交完成狀態(tài),釋放所述全局事務(wù)的相關(guān)資源。在上述技術(shù)方案中,優(yōu)選地,所述步驟606還可以包括在提交所述第二數(shù)據(jù)源的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù)和所述第二數(shù)據(jù)源的本地事務(wù),所述消息回到所述消息中間件的指定列隊(duì)中,重新處理所述消息;在提交所述消息中間件的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,重新處理所述消息,處理結(jié)束后刪除所述消息;在修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài)之前,若出現(xiàn)異常并重新啟動(dòng),則在所述消息中間件中刪除所述消息。在上述技術(shù)方案中,優(yōu)選地,當(dāng)所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)時(shí),允許在所述全局事務(wù)中加入其它數(shù)據(jù)源的本地事務(wù),當(dāng)所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均提交完成狀態(tài)時(shí),不允許在所述全局事務(wù)中加入所述其它數(shù)據(jù)源的本地事務(wù),所述消息中間件的本地事務(wù)的狀態(tài)信息、所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)信息以及所述全局事務(wù)的狀態(tài)信息保存在所述第二數(shù)據(jù)源中,所述第二數(shù)據(jù)源為數(shù)據(jù)庫(kù)數(shù)據(jù)源(例如, OLTP數(shù)據(jù)源)。通過(guò)上述技術(shù)方案,可以實(shí)現(xiàn)使用非XA協(xié)議方式來(lái)保證跨數(shù)據(jù)源的操作結(jié)果的一致性——利用保存在DBMS里的全局事務(wù)的狀態(tài)做雙核對(duì),來(lái)協(xié)調(diào)系統(tǒng)中的DBMS和MOM 這兩類數(shù)據(jù)源,通過(guò)絕對(duì)的狀態(tài)控制來(lái)保證事務(wù)業(yè)務(wù)處理的操作結(jié)果一致性。通過(guò)這種實(shí)現(xiàn)機(jī)制,既避免了使用XA協(xié)議會(huì)帶來(lái)的不利影響和潛在風(fēng)險(xiǎn),同時(shí)又能保證絕對(duì)的事務(wù)一致性。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置,其特征在于,包括消息處理單元,請(qǐng)求打開(kāi)消息中間件的本地事務(wù),接收來(lái)自所述消息中間件的指定列隊(duì)中的消息,根據(jù)所述消息向全局事務(wù)控制單元發(fā)送創(chuàng)建一個(gè)全局事務(wù)的第一請(qǐng)求以及在接收到來(lái)自應(yīng)用服務(wù)單元返回的處理結(jié)果時(shí),向所述全局事務(wù)控制單元發(fā)送發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程的第二請(qǐng)求以及在接收到來(lái)自所述全局事務(wù)單元的命令時(shí),提交或者回滾所述消息中間件的本地事務(wù),所述消息中間件的本地事務(wù)為在所述消息中間件上運(yùn)行的事務(wù),所述消息中間件為第一數(shù)據(jù)源;所述全局事務(wù)控制單元,在接收到來(lái)自所述消息處理單元的所述第一請(qǐng)求時(shí),創(chuàng)建一個(gè)所述全局事務(wù),開(kāi)始第二數(shù)據(jù)源的本地事務(wù)以及在接收到來(lái)自所述消息單元的所述第二請(qǐng)求時(shí),發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程,先提交或者回滾所述第二數(shù)據(jù)源的本地事務(wù),然后命令所述消息處理單元提交或者回滾所述消息中間件的本地事務(wù),以完成所述全局事務(wù)的提交或者回滾過(guò)程,所述全局事務(wù)提交成功后,釋放所述全局事務(wù)的相關(guān)資源, 所述全局事務(wù)為跨所述第一數(shù)據(jù)源和所述第二數(shù)據(jù)源運(yùn)行的事務(wù),所述第二數(shù)據(jù)源的本地事務(wù)為在所述第二數(shù)據(jù)源上運(yùn)行的事務(wù);所述應(yīng)用服務(wù)單元,根據(jù)所述消息的業(yè)務(wù)處理需要從所述第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在所述業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至所述第二數(shù)據(jù)源,將所述處理結(jié)果返回至所述消息處理單元。
2.根據(jù)權(quán)利要求1所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置,其特征在于,所述消息單元還用于在接收到所述消息時(shí),請(qǐng)求所述全局事務(wù)控制單元查看所述消息是否為第一次處理的消息以及接收來(lái)自所述全局事務(wù)單元的所述全局事務(wù)的標(biāo)識(shí)并將所述標(biāo)識(shí)發(fā)送至所述應(yīng)用單元;所述全局事務(wù)單元還用于在確定所述消息為第一次處理時(shí),請(qǐng)求為創(chuàng)建的所述全局事務(wù)分配相應(yīng)的標(biāo)識(shí),并將所述標(biāo)識(shí)發(fā)送至所述消息單元,在確定所述消息不是第一次被處理時(shí),根據(jù)恢復(fù)出來(lái)的對(duì)應(yīng)的所述全局事務(wù)的狀態(tài)繼續(xù)處理所述消息。
3.根據(jù)權(quán)利要求1所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置,其特征在于,所述全局事務(wù)控制單元包括狀態(tài)修改模塊,在所述應(yīng)用服務(wù)單元處理所述消息之前,設(shè)置所述全局事務(wù)的狀態(tài)為正在進(jìn)行業(yè)務(wù)處理狀態(tài),在進(jìn)行所述消息的處理過(guò)程時(shí),將所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)以及在發(fā)起提交所述全局事務(wù)的過(guò)程時(shí),修改所述全局事務(wù)的狀態(tài)為正在提交狀態(tài),修改所述消息中間件的本地事務(wù)的狀態(tài)為正在提交狀態(tài),預(yù)先修改所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)為提交完成狀態(tài),當(dāng)監(jiān)控到所述第二數(shù)據(jù)源的本地事務(wù)和所述消息中間件的本地事務(wù)均提交完成時(shí),先修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài),然后修改所述全局事務(wù)的狀態(tài)為提交完成狀態(tài),釋放所述全局事務(wù)的相關(guān)資源。
4.根據(jù)權(quán)利要求3所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置,其特征在于,所述全局事務(wù)控制單元還包括恢復(fù)模塊,在提交所述第二數(shù)據(jù)源的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,所述應(yīng)用服務(wù)單元將重新處理所述消息,在提交所述消息中間件的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,所述應(yīng)用服務(wù)單元將重新處理所述消息,處理結(jié)束后刪除所述消息以及在修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài)之前,若出現(xiàn)異常并重新啟動(dòng),則在所述消息中間件中刪除所述消息。
5.根據(jù)權(quán)利要求4所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置,其特征在于,所述全局事務(wù)控制單元還包括控制模塊,在所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)時(shí),允許在所述全局事務(wù)中加入其它數(shù)據(jù)源的本地事務(wù), 在所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均提交完成狀態(tài)時(shí),不允許在所述全局事務(wù)中加入所述其它數(shù)據(jù)源的本地事務(wù);所述消息中間件的本地事務(wù)的狀態(tài)信息、所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)信息以及所述全局事務(wù)的狀態(tài)信息保存在所述第二數(shù)據(jù)源中,所述第二數(shù)據(jù)源為數(shù)據(jù)庫(kù)數(shù)據(jù)源。
6.一種保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,其特征在于,包括步驟602,打開(kāi)消息中間件的本地事務(wù),當(dāng)接收到來(lái)自所述消息中間件的指定列隊(duì)中的消息時(shí),根據(jù)所述消息創(chuàng)建一個(gè)全局事務(wù),開(kāi)始第二數(shù)據(jù)源的本地事務(wù),其中,所述消息中間件為第一數(shù)據(jù)源,所述消息中間件的本地事務(wù)為在所述消息中間件上運(yùn)行的事務(wù),所述第二數(shù)據(jù)源的本地事務(wù)為在所述第二數(shù)據(jù)源上運(yùn)行的事務(wù),所述全局事務(wù)為跨所述第一數(shù)據(jù)源和所述第二數(shù)據(jù)源運(yùn)行的事務(wù);步驟604,根據(jù)所述消息的業(yè)務(wù)處理需要從所述第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在所述業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至所述第二數(shù)據(jù)源;步驟606,根據(jù)返回的所述處理結(jié)果發(fā)起提交或者回滾所述全局事務(wù)的過(guò)程,先提交或者回滾所述第二數(shù)據(jù)源的本地事務(wù),然后提交或者回滾所述消息中間件的本地事務(wù),以完成所述全局事務(wù)的提交或者回滾過(guò)程,所述全局事務(wù)提交成功后,釋放所述全局事務(wù)的相關(guān)資源。
7.根據(jù)權(quán)利要求6所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,其特征在于,所述步驟602還包括判斷所述消息是否為第一次處理的消息,若判斷出所述消息為第一次處理, 則創(chuàng)建所述全局事務(wù)并請(qǐng)求為所述全局事務(wù)分配標(biāo)識(shí),根據(jù)所述標(biāo)識(shí)處理所述消息,若判斷出所述消息不是第一次被處理,則根據(jù)恢復(fù)出來(lái)的對(duì)應(yīng)的所述全局事務(wù)的狀態(tài)繼續(xù)處理所述消息。
8.根據(jù)權(quán)利要求6所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,其特征在于,所述步驟602還包括在處理所述消息之前,設(shè)置所述全局事務(wù)的狀態(tài)為正在進(jìn)行業(yè)務(wù)處理狀態(tài), 在進(jìn)行所述消息的處理過(guò)程時(shí),將所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài);所述步驟606還包括在發(fā)起提交所述全局事務(wù)的過(guò)程時(shí),修改所述全局事務(wù)的狀態(tài)為正在提交狀態(tài),修改所述消息中間件的本地事務(wù)的狀態(tài)為正在提交狀態(tài),預(yù)先修改所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)為提交完成狀態(tài),當(dāng)監(jiān)控到所述第二數(shù)據(jù)源的本地事務(wù)和所述消息中間件的本地事務(wù)均提交完成時(shí),先修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài),然后修改所述全局事務(wù)的狀態(tài)為提交完成狀態(tài),釋放所述全局事務(wù)的相關(guān)資源。
9.根據(jù)權(quán)利要求8所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,其特征在于,所述步驟606還包括在提交所述第二數(shù)據(jù)源的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),所述消息返回到所述消息中間件的指定列隊(duì)中,重新處理所述消息;在提交所述消息中間件的本地事務(wù)之前,若出現(xiàn)異常并重新啟動(dòng),則回滾所述消息中間件的本地事務(wù),將所述消息返回到所述消息中間件的指定列隊(duì)中,重新處理所述消息,處理結(jié)束后刪除所述消息;在修改所述消息中間件的本地事務(wù)的狀態(tài)為提交完成狀態(tài)之前,若出現(xiàn)異常并重新啟動(dòng),則在所述消息中間件中刪除所述消息。
10.根據(jù)權(quán)利要求8所述的保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,其特征在于,當(dāng)所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均設(shè)置為正在進(jìn)行業(yè)務(wù)處理狀態(tài)時(shí),允許在所述全局事務(wù)中加入其它數(shù)據(jù)源的本地事務(wù),當(dāng)所述消息中間件的本地事務(wù)的狀態(tài)和所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)均提交完成狀態(tài)時(shí),不允許在所述全局事務(wù)中加入所述其它數(shù)據(jù)源的本地事務(wù),所述消息中間件的本地事務(wù)的狀態(tài)信息、所述第二數(shù)據(jù)源的本地事務(wù)的狀態(tài)信息以及所述全局事務(wù)的狀態(tài)信息保存在所述第二數(shù)據(jù)源中,所述第二數(shù)據(jù)源為數(shù)據(jù)庫(kù)數(shù)據(jù)源。
全文摘要
本發(fā)明提供了一種保證跨數(shù)據(jù)源操作結(jié)果一致性的方法,包括打開(kāi)消息中間件的本地事務(wù),當(dāng)接收到來(lái)自消息中間件的指定列隊(duì)中的消息時(shí),根據(jù)消息創(chuàng)建一個(gè)全局事務(wù),開(kāi)始第二數(shù)據(jù)源的本地事務(wù),其中,消息中間件為第一數(shù)據(jù)源;根據(jù)消息的業(yè)務(wù)處理需要從第二數(shù)據(jù)源中獲取所需業(yè)務(wù)數(shù)據(jù),在業(yè)務(wù)處理結(jié)束時(shí),將生成的處理結(jié)果保存至第二數(shù)據(jù)源;根據(jù)返回的處理結(jié)果發(fā)起提交或者回滾全局事務(wù)的過(guò)程,先提交或者回滾第二數(shù)據(jù)源的本地事務(wù),然后提交或者回滾消息中間件的本地事務(wù),全局事務(wù)提交或者回滾成功后,釋放全局事務(wù)的相關(guān)資源。本發(fā)明還提供了一種保證跨數(shù)據(jù)源操作結(jié)果一致性的裝置??梢栽诜荴A協(xié)議方式下,保證跨數(shù)據(jù)源的操作結(jié)果的一致性。
文檔編號(hào)G06F17/30GK102306197SQ20111028399
公開(kāi)日2012年1月4日 申請(qǐng)日期2011年9月22日 優(yōu)先權(quán)日2011年9月22日
發(fā)明者栗竹冉 申請(qǐng)人:用友軟件股份有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1