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

數(shù)據(jù)庫、多數(shù)據(jù)庫操作事務(wù)一致性保證方法及系統(tǒng)與流程

文檔序號:11276403閱讀:444來源:國知局
數(shù)據(jù)庫、多數(shù)據(jù)庫操作事務(wù)一致性保證方法及系統(tǒng)與流程

本發(fā)明涉及數(shù)據(jù)業(yè)務(wù)處理領(lǐng)域,更具體涉及一種數(shù)據(jù)庫、多數(shù)據(jù)庫操作事務(wù)一致性保證方法及系統(tǒng)。



背景技術(shù):

隨著lte(長期演進(jìn))流量運(yùn)營時(shí)代的到來,當(dāng)前boss(業(yè)務(wù)支撐系統(tǒng))領(lǐng)域新業(yè)務(wù)層出不窮,系統(tǒng)性能需求呈幾何級的增長,單點(diǎn)數(shù)據(jù)庫已經(jīng)很難滿足業(yè)務(wù)增長的需求。數(shù)據(jù)庫的拆分和異構(gòu)(物理數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫、nosql數(shù)據(jù)庫等混合使用)成了一項(xiàng)重要訴求,系統(tǒng)的功能集群化分布式處理也成了趨勢。

傳統(tǒng)常用的中間件系統(tǒng)如cics、tuxedo等基于xa框架2pc(兩階段提交)事務(wù)一致性保障方式因?yàn)橄拗铺?,伸縮性的太差;boss系統(tǒng)在“云”化的趨勢下,需要逐步剝離出核心系統(tǒng),引入新的多數(shù)據(jù)庫操作事務(wù)一致性保證機(jī)制成了一項(xiàng)重要訴求。

如圖1為現(xiàn)有技術(shù)中數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)示意圖,客戶端與應(yīng)用服務(wù)的應(yīng)用邏輯連接,應(yīng)用服務(wù)的olt適配層與數(shù)據(jù)層連接,實(shí)現(xiàn)對數(shù)據(jù)庫的操作,其中數(shù)據(jù)庫層包括物理數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫、數(shù)據(jù)緩存等。

但是現(xiàn)有技術(shù)中采用這種簡單的連接池或連接代理方案,不能保證多次調(diào)用都能使用同一數(shù)據(jù)庫會(huì)話(session),不能保證數(shù)據(jù)資源的透明訪問(提交前的中間數(shù)據(jù)只能在同一會(huì)話session內(nèi)看得到)。同時(shí)應(yīng)用直接連接多個(gè)數(shù)據(jù)源,每個(gè)應(yīng)用都需要考慮多數(shù)據(jù)源操作事務(wù)一致性問題,造成應(yīng)用邏輯過于復(fù)雜。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明要解決的技術(shù)問題是如何以簡單有效的方式保證對數(shù)據(jù)庫的單用戶或多用戶的單次或多次操作的事務(wù)的一致性。

為了解決上述技術(shù)問題,本發(fā)明提供了一種多數(shù)據(jù)庫操作事務(wù)一致性保證方法,所述方法包括以下步驟:

s100、第一客戶端發(fā)起業(yè)務(wù)請求,第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;其中所述業(yè)務(wù)請求包括對多個(gè)數(shù)據(jù)庫進(jìn)行操作的多個(gè)子請求;一次所述業(yè)務(wù)請求對應(yīng)一個(gè)所述事務(wù)id;

s102、所述第一數(shù)據(jù)服務(wù)客戶端檢查所述子請求是否有事務(wù),對于每一個(gè)有事務(wù)的所述子請求,依次執(zhí)行以下操作:

s1021、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)于所述子請求的操作命令以及綁定變量形成報(bào)文信息,將所述報(bào)文信息序列化生成重做日志,之后存儲(chǔ)所述重做日志并將所述報(bào)文信息發(fā)送給第一數(shù)據(jù)服務(wù)端;

s1022、所述第一數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的子請求放入請求隊(duì)列;

s1023、所述第一數(shù)據(jù)服務(wù)端在有空閑進(jìn)程時(shí)從所述請求隊(duì)列獲取所述子請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;

s103、若所有事務(wù)的所述子請求均利用所述步驟s102處理成功,則所述第一客戶端向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;

s104、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交請求,對于每一個(gè)處理成功的所述子請求,依次執(zhí)行以下操作:

s1041、根據(jù)所述事務(wù)id獲取對應(yīng)的所述重做日志;

s1042、根據(jù)所述重做日志調(diào)用對應(yīng)的所述第一數(shù)據(jù)服務(wù)端提交處理結(jié)果給對應(yīng)的數(shù)據(jù)庫,并將提交結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;

s1043、若接收的所有提交結(jié)果均為成功則本次業(yè)務(wù)完成,清除對應(yīng)的所述事務(wù)id以及重做日志。

優(yōu)選地,所述步驟s1043中,若接收的第一個(gè)所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則根據(jù)對應(yīng)的所述重做日志生成錯(cuò)誤文件,供異步平賬 進(jìn)程重做處理;

所述步驟s1043中,若接收的第一個(gè)所述提交結(jié)果為失敗,則執(zhí)行回滾處理。

優(yōu)選地,所述步驟s102之后,所述方法還包括以下步驟:

若所述步驟s102的執(zhí)行過程中出現(xiàn)異常,則執(zhí)行回滾處理。

優(yōu)選地,所述回滾處理包括以下步驟:

所述第一數(shù)據(jù)服務(wù)客戶端向所述第一客戶端反饋結(jié)果響應(yīng);

所述第一客戶端向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)送業(yè)務(wù)回滾指令;

所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述業(yè)務(wù)回滾指令以及對應(yīng)的所述事務(wù)id獲取所述重做日志;

所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述重做日志,調(diào)用對應(yīng)的所述第一數(shù)據(jù)服務(wù)端對已經(jīng)處理過的每個(gè)所述子請求做對應(yīng)的回滾操作;

所述第一數(shù)據(jù)服務(wù)客戶端清空對應(yīng)的所述事務(wù)id以及所述重做日志。

優(yōu)選地,所述步驟s1023之后、所述步驟s103之前,所述方法還包括以下步驟:

判斷當(dāng)前的所述子請求是否需要事務(wù)保持,若需要事務(wù)保持,則當(dāng)前進(jìn)程只能分配給具有相同的所述事務(wù)id的請求使用,若不需要事務(wù)保持,則釋放當(dāng)前進(jìn)程。

優(yōu)選地,所述第一客戶端發(fā)起新的業(yè)務(wù)請求時(shí),所述方法還包括以下步驟:

s105、所述第一數(shù)據(jù)服務(wù)客戶端判斷該業(yè)務(wù)請求是否是對于某一數(shù)據(jù)庫的第一次業(yè)務(wù)請求,若不是第一次業(yè)務(wù)請求,則所述第一數(shù)據(jù)服務(wù)客戶端將所述新的業(yè)務(wù)請求的事務(wù)id設(shè)置為與前一次業(yè)務(wù)請求的事務(wù)id;

s106、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述新的業(yè)務(wù)請求的事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第一數(shù)據(jù)服務(wù)端;

s107、所述第一數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的請求放入請求隊(duì)列;

s108、所述第一數(shù)據(jù)服務(wù)端判斷是否存在所述新的業(yè)務(wù)請求的事務(wù)id的 獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取所述請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;所述第一數(shù)據(jù)服務(wù)客戶端將所述處理結(jié)果響應(yīng)給所述第一客戶端;

s109、所述第一客戶端向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;所述第一數(shù)據(jù)服務(wù)客戶端將所述提交請求的事務(wù)id設(shè)置為前一次業(yè)務(wù)請求的事務(wù)id,并且所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交請求生成報(bào)文信息發(fā)送給對應(yīng)的所述第一數(shù)據(jù)服務(wù)端;

s110、所述第一數(shù)據(jù)服務(wù)端根據(jù)接收的步驟s109中的所述報(bào)文信息,連接對應(yīng)的數(shù)據(jù)庫,并判斷是否存在所述提交請求的事務(wù)id的獨(dú)占進(jìn)程,若存在,利用所述獨(dú)占進(jìn)程執(zhí)行提交操作,并在提交完成后向所述第一數(shù)據(jù)服務(wù)客戶端飯反饋提交響應(yīng),所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交響應(yīng)向所述第一客戶端反饋對應(yīng)的提交結(jié)果。

一種數(shù)據(jù)庫操作事務(wù)一致性保證方法,所述方法包括以下步驟:

s200、第二客戶端的向第二數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè)務(wù)請求,所述第二數(shù)據(jù)服務(wù)客戶端根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;

s201、所述第二數(shù)據(jù)服務(wù)客戶端調(diào)用所述第三數(shù)據(jù)服務(wù)客戶端,并且所述第三數(shù)據(jù)服務(wù)客戶端產(chǎn)生與所述第二數(shù)據(jù)服務(wù)客戶端所產(chǎn)生的事務(wù)id相同的事務(wù)id;

s202、所述第三數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,并將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

s203、所述第二數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將業(yè)務(wù)請求放入請求隊(duì)列;

s204、所述第二數(shù)據(jù)服務(wù)端在有空閑進(jìn)程時(shí)從所述請求隊(duì)列獲取所述業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;

s205、判斷當(dāng)前的業(yè)務(wù)請求是否需要事務(wù)保持,若需要事務(wù)保持,則當(dāng)前進(jìn)程只能分配給具有相同的所述事務(wù)id的請求使用,若不需要事務(wù)保持,則 釋放當(dāng)前進(jìn)程;

s206、所述第三客戶端發(fā)起第三次業(yè)務(wù)請求時(shí),所述第三數(shù)據(jù)服務(wù)客戶端產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id;

s207、所述第三數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

s208、所述第二數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的請求放入請求隊(duì)列;

s209、所述第二數(shù)據(jù)服務(wù)端判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;

s2010、第二客戶端的向第二數(shù)據(jù)服務(wù)客戶端發(fā)起第二次業(yè)務(wù)請求,所述第二數(shù)據(jù)服務(wù)客戶端產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id;

s2011、所述第二數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

s2012、所述第二數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的請求放入請求隊(duì)列;

s2013、所述第二數(shù)據(jù)服務(wù)端判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;

s2014、對于同一數(shù)據(jù)庫的業(yè)務(wù)完成之后,所述第二客戶端向所述第二數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;所述第二數(shù)據(jù)服務(wù)客戶端將所述提交請求的事務(wù)id設(shè)置為前一次業(yè)務(wù)請求的事務(wù)id;并向所述第三數(shù)據(jù)服務(wù)客戶端發(fā)起請求;

所述第三數(shù)據(jù)服務(wù)客戶端判斷當(dāng)前提交請求是否為自己發(fā)出的請求,若不 是,則所述第三數(shù)據(jù)服務(wù)客戶端發(fā)聵預(yù)定響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端,所述第二數(shù)據(jù)服務(wù)客戶端收到所述預(yù)定響應(yīng)后,根據(jù)所述提交請求生成報(bào)文信息發(fā)送給對應(yīng)的所述第二數(shù)據(jù)服務(wù)端;

s2015、所述第二數(shù)據(jù)服務(wù)端根據(jù)接收的步驟s2014中的所述報(bào)文信息,連接對應(yīng)的數(shù)據(jù)庫,并判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,利用所述獨(dú)占進(jìn)程執(zhí)行提交操作,并在提交完成后向所述第二數(shù)據(jù)服務(wù)客戶端飯反饋提交響應(yīng)。

一種利用上述多數(shù)據(jù)庫操作事務(wù)一致性保證方法保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng),所述系統(tǒng)包括第一客戶端、若干個(gè)數(shù)據(jù)庫、第一數(shù)據(jù)服務(wù)客戶端以及第一數(shù)據(jù)服務(wù)端;

所述第一客戶端用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè)務(wù)請求;

所述第一數(shù)據(jù)服務(wù)客戶端用于根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;其中所述業(yè)務(wù)請求包括對多個(gè)數(shù)據(jù)庫進(jìn)行操作的多個(gè)子請求;一次所述業(yè)務(wù)請求對應(yīng)一個(gè)所述事務(wù)id;

所述第一數(shù)據(jù)服務(wù)客戶端還用于檢查所述子請求是否有事務(wù),對于每一個(gè)有事務(wù)的所述子請求,所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述事務(wù)id、對應(yīng)于所述子請求的操作命令以及綁定變量形成報(bào)文信息,將所述報(bào)文信息序列化生成重做日志,之后存儲(chǔ)所述重做日志并將所述報(bào)文信息發(fā)送給所述第一數(shù)據(jù)服務(wù)端;

所述第一數(shù)據(jù)服務(wù)端用于解析所述報(bào)文信息,并將對應(yīng)的子請求放入請求隊(duì)列,并且在有空閑進(jìn)程時(shí),所述第一數(shù)據(jù)服務(wù)端還用于從所述請求隊(duì)列獲取所述子請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;在所有事務(wù)的所述子請求均處理成功,則所述第一客戶端還用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;對于每一個(gè)處理成功的所述子請求,所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述提交請求以及所述事務(wù)id獲取對應(yīng)的所述重做日志,之后根據(jù)所述重做日志調(diào)用對應(yīng)的所述第一數(shù)據(jù)服務(wù)端提交處理結(jié)果給對應(yīng)的數(shù)據(jù)庫,并將提交結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;在所有提交結(jié)果均為成功則本次業(yè)務(wù)完 成,所述第一數(shù)據(jù)服務(wù)客戶端還用于清除對應(yīng)的所述事務(wù)id以及重做日志。

優(yōu)選地,在所述第一數(shù)據(jù)服務(wù)客戶端接收的第一個(gè)所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)對應(yīng)的所述重做日志生成錯(cuò)誤文件,供異步平賬進(jìn)程重做處理;

至少一個(gè)所述子請求在執(zhí)行對應(yīng)的所述操作命令時(shí)出現(xiàn)異常時(shí),所述第一數(shù)據(jù)服務(wù)客戶端和所述第一數(shù)據(jù)服務(wù)端執(zhí)行回滾操作。

一種利用上述數(shù)據(jù)庫操作事務(wù)一致性保證方法保證數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng),所述系統(tǒng)包括第二客戶端、第二數(shù)據(jù)服務(wù)客戶端、第三數(shù)據(jù)服務(wù)客戶端以及第二數(shù)據(jù)服務(wù)端;

所述第二客戶端用于向所述第二數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè)務(wù)請求,所述第二數(shù)據(jù)服務(wù)客戶端用于根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;所述第二數(shù)據(jù)服務(wù)客戶端還用于調(diào)用所述第三數(shù)據(jù)服務(wù)客戶端,并且所述第三數(shù)據(jù)服務(wù)客戶端用于產(chǎn)生第一次業(yè)務(wù)請求,并根據(jù)所述業(yè)務(wù)請求產(chǎn)生與所述第二數(shù)據(jù)服務(wù)客戶端所產(chǎn)生的事務(wù)id相同的事務(wù)id;

所述第三數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,并將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

所述第二數(shù)據(jù)服務(wù)端用于解析所述報(bào)文信息,并將業(yè)務(wù)請求放入請求隊(duì)列,并且在有空閑進(jìn)程時(shí),所述第二數(shù)據(jù)服務(wù)端還用于從請求隊(duì)列獲取所述業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;

所述第三數(shù)據(jù)服務(wù)客戶端還用于判斷當(dāng)前的業(yè)務(wù)請求是否需要事務(wù)保持,若需要事務(wù)保持,則所述第三數(shù)據(jù)服務(wù)客戶端將當(dāng)前進(jìn)程只分配給具有相同的所述事務(wù)id的請求使用,若不需要事務(wù)保持,則釋放當(dāng)前進(jìn)程;

所述第三客戶端還用于發(fā)起第二次業(yè)務(wù)請求,此時(shí)所述第三數(shù)據(jù)服務(wù)客戶端還用于產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id,并且根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;所述第二數(shù)據(jù)服務(wù)端還用于解析所述報(bào)文信息,將對應(yīng)的請求放入請求隊(duì)列,并且判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在, 則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端還用于將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;

所述第二客戶端向第二數(shù)據(jù)服務(wù)客戶端發(fā)起第二次業(yè)務(wù)請求時(shí),所述第二數(shù)據(jù)服務(wù)客戶端還用于產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id,并且根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端,所述第二數(shù)據(jù)服務(wù)端還用于解析所述報(bào)文信息,將對應(yīng)的請求放入請求隊(duì)列,并判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端還用于將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;

對同一數(shù)據(jù)庫的業(yè)務(wù)完成之后,所述第二客戶端還用于向所述第二數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;所述第二數(shù)據(jù)服務(wù)客戶端還用于將所述提交請求的事務(wù)id設(shè)置為前一次業(yè)務(wù)請求的事務(wù)id;并向所述第三數(shù)據(jù)服務(wù)客戶端發(fā)起請求;所述第三數(shù)據(jù)服務(wù)客戶端還用于判斷當(dāng)前提交請求是否為自己發(fā)出的請求,若不是,則所述第三數(shù)據(jù)服務(wù)客戶端發(fā)聵預(yù)定響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端,所述第二數(shù)據(jù)服務(wù)客戶端收到所述預(yù)定響應(yīng)后,還用于根據(jù)所述提交請求生成報(bào)文信息發(fā)送給對應(yīng)的所述第二數(shù)據(jù)服務(wù)端;所述第二數(shù)據(jù)服務(wù)端還用于根據(jù)接收的所述報(bào)文信息,連接對應(yīng)的數(shù)據(jù)庫,并判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,利用所述獨(dú)占進(jìn)程執(zhí)行提交操作,并在提交完成后向所述第二數(shù)據(jù)服務(wù)客戶端飯反饋提交響應(yīng)。

本發(fā)明提供了一種數(shù)據(jù)庫、多數(shù)據(jù)庫操作事務(wù)一致性保證方法及系統(tǒng),本發(fā)明為具有事務(wù)的業(yè)務(wù)請求生成事務(wù)id和重放日志,將重放日志進(jìn)行存儲(chǔ),并將該業(yè)務(wù)請求發(fā)送給數(shù)據(jù)服務(wù)客戶端,由數(shù)據(jù)服務(wù)端完成相應(yīng)的操作,并將結(jié)果反饋給數(shù)據(jù)服務(wù)客戶端。在處理過程中若出現(xiàn)異常則根據(jù)事務(wù)id將對應(yīng)于這次業(yè)務(wù)請求的所有操作全部回滾,若對應(yīng)于這次業(yè)務(wù)請求的所有操作全部 完成,則根據(jù)對應(yīng)的重放日志進(jìn)行提交,在提交過程中若出現(xiàn)異常則進(jìn)行回滾處理或異常處理,提交完畢相應(yīng)的數(shù)據(jù)庫更新完畢,本發(fā)明保證了多數(shù)據(jù)庫操作的事務(wù)一致性。多個(gè)用戶多次對數(shù)據(jù)庫進(jìn)行操作時(shí),數(shù)據(jù)服務(wù)端對各個(gè)業(yè)務(wù)請求是否需要進(jìn)行業(yè)務(wù)保持進(jìn)行記錄,并為需要業(yè)務(wù)保持的請求分配獨(dú)占進(jìn)程,該獨(dú)占進(jìn)程只分配給特定事務(wù)id的請求使用,從而通過事務(wù)id的設(shè)置在多用戶多次操作數(shù)據(jù)庫以及提交時(shí)能夠保證事務(wù)的一致性。本發(fā)明支持對多個(gè)數(shù)據(jù)操作且能保證事務(wù)一致性,簡化應(yīng)用開發(fā)的復(fù)雜度;同時(shí)本發(fā)明支持對dml操作的回滾和重做(redo),應(yīng)用層不用處理路由管理和事務(wù)管理,從而簡化應(yīng)用,降低開發(fā)成本。另外,本發(fā)明支持跨服務(wù)的數(shù)據(jù)庫連接會(huì)話重入,確保一個(gè)業(yè)務(wù)事務(wù)中,多個(gè)服務(wù)進(jìn)程(或線程)對同一數(shù)據(jù)的多次修改后臟數(shù)據(jù)(未做提交中間數(shù)據(jù))各個(gè)進(jìn)程(或線程)透明可見。

附圖說明

圖1為現(xiàn)有技術(shù)中數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)示意圖;

圖2為本發(fā)明的多數(shù)據(jù)庫操作事務(wù)一致性保證方法的流程圖;

圖3為本發(fā)明的數(shù)據(jù)庫操作事務(wù)一致性保證方法的流程圖;

圖4為本發(fā)明的保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng)結(jié)構(gòu)示意圖;

圖5為本發(fā)明的一個(gè)較佳實(shí)施例一的保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng)結(jié)構(gòu)示意圖;

圖6為本發(fā)明的一個(gè)較佳實(shí)施例二的多數(shù)據(jù)庫操作事務(wù)一致性保證方法的流程圖;

圖7為本發(fā)明的一個(gè)較佳實(shí)施例二中回滾處理的流程圖;

圖8為本發(fā)明的一個(gè)較佳實(shí)施例二中異常處理的流程圖;

圖9為本發(fā)明的一個(gè)較佳實(shí)施例三的保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng)的結(jié)構(gòu)示意圖;

圖10為本發(fā)明的一個(gè)較佳實(shí)施例四的保證多數(shù)據(jù)庫操作事務(wù)一致性的方法流程圖;

圖11為本發(fā)明的一個(gè)較佳實(shí)施例五的保證數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng) 的結(jié)構(gòu)示意圖;

圖12為本發(fā)明的一個(gè)較佳實(shí)施例六的保證數(shù)據(jù)庫操作事務(wù)一致性的方法流程圖。

具體實(shí)施方式

下面結(jié)合附圖和實(shí)施例對本發(fā)明作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說明發(fā)明,但不能用來限制本發(fā)明的范圍。

一種多數(shù)據(jù)庫操作事務(wù)一致性保證方法,如圖2所示,所述方法包括以下步驟:

s100、第一客戶端發(fā)起業(yè)務(wù)請求,第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;其中所述業(yè)務(wù)請求包括對多個(gè)數(shù)據(jù)庫進(jìn)行操作的多個(gè)子請求;一次所述業(yè)務(wù)請求對應(yīng)一個(gè)所述事務(wù)id;

s102、所述第一數(shù)據(jù)服務(wù)客戶端檢查所述子請求是否有事務(wù),對于每一個(gè)有事務(wù)的所述子請求,執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,具體地:

s1021、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)于所述子請求的操作命令以及綁定變量形成報(bào)文信息,將所述報(bào)文信息序列化生成重做日志,之后存儲(chǔ)所述重做日志并將所述報(bào)文信息發(fā)送給第一數(shù)據(jù)服務(wù)端;

s1022、所述第一數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的子請求放入請求隊(duì)列;

s1023、所述第一數(shù)據(jù)服務(wù)端在有空閑進(jìn)程時(shí)從所述請求隊(duì)列獲取所述子請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;

其中第一數(shù)據(jù)服務(wù)端有若干個(gè),根據(jù)子請求的需求有對應(yīng)的服務(wù)端執(zhí)行對應(yīng)的所述操作命令;

s103、若所有事務(wù)的所述子請求均利用所述步驟s102處理成功,則所述第一客戶端向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;

s104、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交請求,進(jìn)行提交操作,具體地對于每一個(gè)處理成功的所述子請求,依次執(zhí)行以下操作:

s1041、根據(jù)所述事務(wù)id獲取對應(yīng)的所述重做日志;

s1042、根據(jù)所述重做日志調(diào)用對應(yīng)的所述第一數(shù)據(jù)服務(wù)端提交處理結(jié)果給對應(yīng)的數(shù)據(jù)庫,并將提交結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;

s1043、若接收的所有提交結(jié)果均為成功則本次業(yè)務(wù)完成,清除對應(yīng)的所述事務(wù)id以及重做日志。

上述方法保證了多數(shù)據(jù)庫操作的事務(wù)一致性。

進(jìn)一步地,所述步驟s1043中,若接收的第一個(gè)所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則根據(jù)對應(yīng)的所述重做日志生成錯(cuò)誤文件,供異步平賬進(jìn)程重做處理;

所述步驟s1043中,若接收的第一個(gè)所述提交結(jié)果為失敗,則執(zhí)行回滾處理。

進(jìn)一步地,所述步驟s102之后,所述方法還包括以下步驟:

若所述步驟s102的執(zhí)行過程中出現(xiàn)異常,則執(zhí)行回滾處理。

進(jìn)一步地,所述回滾處理包括以下步驟:

所述第一數(shù)據(jù)服務(wù)客戶端向所述第一客戶端反饋結(jié)果響應(yīng);

所述第一客戶端向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)送業(yè)務(wù)回滾指令;

所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述業(yè)務(wù)回滾指令以及對應(yīng)的所述事務(wù)id獲取所述重做日志;

所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述重做日志,調(diào)用對應(yīng)的所述第一數(shù)據(jù)服務(wù)端對已經(jīng)處理過的每個(gè)所述子請求做對應(yīng)的回滾操作;

所述第一數(shù)據(jù)服務(wù)客戶端清空對應(yīng)的所述事務(wù)id以及所述重做日志。

進(jìn)一步地,所述步驟s1023之后、所述步驟s103之前,所述方法還包括以下步驟:

判斷當(dāng)前的所述子請求是否需要事務(wù)保持,若需要事務(wù)保持,則當(dāng)前進(jìn)程只能分配給具有相同的所述事務(wù)id的請求使用,若不需要事務(wù)保持,則釋放當(dāng)前進(jìn)程。

進(jìn)一步地,所述第一客戶端發(fā)起新的業(yè)務(wù)請求時(shí),所述方法還包括以下步驟:

s105、所述第一數(shù)據(jù)服務(wù)客戶端判斷該業(yè)務(wù)請求是否是對于某一數(shù)據(jù)庫的第一次業(yè)務(wù)請求,若不是第一次業(yè)務(wù)請求,則所述第一數(shù)據(jù)服務(wù)客戶端將所述新的業(yè)務(wù)請求的事務(wù)id設(shè)置為與前一次業(yè)務(wù)請求的事務(wù)id;

s106、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述新的業(yè)務(wù)請求的事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第一數(shù)據(jù)服務(wù)端;

s107、所述第一數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的請求放入請求隊(duì)列;

s108、所述第一數(shù)據(jù)服務(wù)端判斷是否存在所述新的業(yè)務(wù)請求的事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取所述請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;所述第一數(shù)據(jù)服務(wù)客戶端將所述處理結(jié)果響應(yīng)給所述第一客戶端;

s109、所述第一客戶端向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;所述第一數(shù)據(jù)服務(wù)客戶端將所述提交請求的事務(wù)id設(shè)置為前一次業(yè)務(wù)請求的事務(wù)id,并且所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交請求生成報(bào)文信息發(fā)送給對應(yīng)的所述第一數(shù)據(jù)服務(wù)端;

s110、所述第一數(shù)據(jù)服務(wù)端根據(jù)接收的步驟s109中的所述報(bào)文信息,連接對應(yīng)的數(shù)據(jù)庫,并判斷是否存在所述提交請求的事務(wù)id的獨(dú)占進(jìn)程,若存在,利用所述獨(dú)占進(jìn)程執(zhí)行提交操作,并在提交完成后向所述第一數(shù)據(jù)服務(wù)客戶端飯反饋提交響應(yīng),所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交響應(yīng)向所述第一客戶端反饋對應(yīng)的提交結(jié)果。

本發(fā)明還公開了一種數(shù)據(jù)庫操作事務(wù)一致性保證方法,如圖2所示,所述方法包括以下步驟:

s200、第二客戶端的向第二數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè)務(wù)請求,所述第二數(shù)據(jù)服務(wù)客戶端根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;

s201、所述第二數(shù)據(jù)服務(wù)客戶端調(diào)用所述第三數(shù)據(jù)服務(wù)客戶端,并且所述第三數(shù)據(jù)服務(wù)客戶端產(chǎn)生與所述第二數(shù)據(jù)服務(wù)客戶端所產(chǎn)生的事務(wù)id相同的 事務(wù)id;

s202、所述第三數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,并將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

s203、所述第二數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將業(yè)務(wù)請求放入請求隊(duì)列;

s204、所述第二數(shù)據(jù)服務(wù)端在有空閑進(jìn)程時(shí)從所述請求隊(duì)列獲取所述業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;

s205、判斷當(dāng)前的業(yè)務(wù)請求是否需要事務(wù)保持,若需要事務(wù)保持,則當(dāng)前進(jìn)程只能分配給具有相同的所述事務(wù)id的請求使用,若不需要事務(wù)保持,則釋放當(dāng)前進(jìn)程;

s206、所述第三客戶端發(fā)起第三次業(yè)務(wù)請求時(shí),所述第三數(shù)據(jù)服務(wù)客戶端產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id;

s207、所述第三數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

s208、所述第二數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的請求放入請求隊(duì)列;

s209、所述第二數(shù)據(jù)服務(wù)端判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;

s2010、第二客戶端的向第二數(shù)據(jù)服務(wù)客戶端發(fā)起第二次業(yè)務(wù)請求,所述第二數(shù)據(jù)服務(wù)客戶端產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id;

s2011、所述第二數(shù)據(jù)服務(wù)客戶端根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;

s2012、所述第二數(shù)據(jù)服務(wù)端解析所述報(bào)文信息,并將對應(yīng)的請求放入請求隊(duì)列;

s2013、所述第二數(shù)據(jù)服務(wù)端判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;

s2014、對于同一數(shù)據(jù)庫的業(yè)務(wù)完成之后,所述第二客戶端向所述第二數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;所述第二數(shù)據(jù)服務(wù)客戶端將所述提交請求的事務(wù)id設(shè)置為前一次業(yè)務(wù)請求的事務(wù)id;并向所述第三數(shù)據(jù)服務(wù)客戶端發(fā)起請求;

所述第三數(shù)據(jù)服務(wù)客戶端判斷當(dāng)前提交請求是否為自己發(fā)出的請求,若不是,則所述第三數(shù)據(jù)服務(wù)客戶端發(fā)送預(yù)定響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端,所述第二數(shù)據(jù)服務(wù)客戶端收到所述預(yù)定響應(yīng)后,根據(jù)所述提交請求生成報(bào)文信息發(fā)送給對應(yīng)的所述第二數(shù)據(jù)服務(wù)端;

s2015、所述第二數(shù)據(jù)服務(wù)端根據(jù)接收的步驟s2014中的所述報(bào)文信息,連接對應(yīng)的數(shù)據(jù)庫,并判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,利用所述獨(dú)占進(jìn)程執(zhí)行提交操作,并在提交完成后向所述第二數(shù)據(jù)服務(wù)客戶端飯反饋提交響應(yīng)。

一種利用上述多數(shù)據(jù)庫操作事務(wù)一致性保證方法保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng),所述系統(tǒng)包括第一客戶端、若干個(gè)數(shù)據(jù)庫、第一數(shù)據(jù)服務(wù)客戶端以及第一數(shù)據(jù)服務(wù)端;所述第一客戶端用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè)務(wù)請求;所述第一數(shù)據(jù)服務(wù)客戶端用于根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;其中所述業(yè)務(wù)請求包括對多個(gè)數(shù)據(jù)庫進(jìn)行操作的多個(gè)子請求;一次所述業(yè)務(wù)請求對應(yīng)一個(gè)所述事務(wù)id;所述第一數(shù)據(jù)服務(wù)客戶端還用于檢查所述子請求是否有事務(wù),對于每一個(gè)有事務(wù)的所述子請求,所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述事務(wù)id、對應(yīng)于所述子請求的操作命令以及綁定變量形成報(bào)文信息,將所述報(bào)文信息序列化生成重做日志,之后存儲(chǔ)所述重做日志并將所述報(bào)文信息發(fā)送給所述第一數(shù)據(jù)服務(wù)端;所述第一數(shù)據(jù)服務(wù)端用于解析所述報(bào)文信息,并將對應(yīng)的子請求放入請求隊(duì)列,并且在有空閑進(jìn)程時(shí),所述第一數(shù)據(jù)服務(wù)端 還用于從所述請求隊(duì)列獲取所述子請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;在所有事務(wù)的所述子請求均處理成功,則所述第一客戶端還用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;對于每一個(gè)處理成功的所述子請求,所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述提交請求以及所述事務(wù)id獲取對應(yīng)的所述重做日志,之后根據(jù)所述重做日志調(diào)用對應(yīng)的所述第一數(shù)據(jù)服務(wù)端提交處理結(jié)果給對應(yīng)的數(shù)據(jù)庫,并將提交結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;在所有提交結(jié)果均為成功則本次業(yè)務(wù)完成,所述第一數(shù)據(jù)服務(wù)客戶端還用于清除對應(yīng)的所述事務(wù)id以及重做日志。

如圖4所示,上述第一數(shù)據(jù)服務(wù)客戶端,即數(shù)據(jù)服務(wù)(客戶端)以及所述第一數(shù)據(jù)服務(wù)端,即數(shù)據(jù)服務(wù)(服務(wù)端)位于數(shù)據(jù)訪問層,多個(gè)應(yīng)用位于應(yīng)用層,數(shù)據(jù)庫層包括若干個(gè)內(nèi)存數(shù)據(jù)庫、物理數(shù)據(jù)庫等。

圖4中,應(yīng)用層用于實(shí)現(xiàn)具體業(yè)務(wù)功能,通過數(shù)據(jù)訪問層(dal)統(tǒng)一訪問數(shù)據(jù)源。應(yīng)用層通過數(shù)據(jù)服務(wù)和數(shù)據(jù)庫打交道,從而簡化應(yīng)用的邏輯。數(shù)據(jù)訪問層(dal)由數(shù)據(jù)服務(wù)(客戶端)和數(shù)據(jù)服務(wù)(服務(wù)端)兩部分組成,數(shù)據(jù)服務(wù)(客戶端)以連接庫(lib)形式和應(yīng)用集成到一起,數(shù)據(jù)服務(wù)(客戶端)通過數(shù)據(jù)服務(wù)(服務(wù)端)統(tǒng)一和數(shù)據(jù)庫進(jìn)行交互;數(shù)據(jù)訪問層統(tǒng)一提供路由管理、事務(wù)管理、dml語句執(zhí)行等處理。數(shù)據(jù)層將所有的數(shù)據(jù)庫(物理數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫、nosql數(shù)據(jù)庫等)統(tǒng)一納入數(shù)據(jù)層,通過數(shù)據(jù)訪問層統(tǒng)一和數(shù)據(jù)庫進(jìn)行連接管理和數(shù)據(jù)交互。

進(jìn)一步地,在所述第一數(shù)據(jù)服務(wù)客戶端接收的第一個(gè)所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)對應(yīng)的所述重做日志生成錯(cuò)誤文件,供異步平賬進(jìn)程重做處理;

至少一個(gè)所述子請求在執(zhí)行對應(yīng)的所述操作命令時(shí)出現(xiàn)異常時(shí),所述第一數(shù)據(jù)服務(wù)客戶端和所述第一數(shù)據(jù)服務(wù)端執(zhí)行回滾操作。

一種上述數(shù)據(jù)庫操作事務(wù)一致性保證方法保證數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng),所述系統(tǒng)包括第二客戶端、第二數(shù)據(jù)服務(wù)客戶端、第三數(shù)據(jù)服務(wù)客戶端以及第二數(shù)據(jù)服務(wù)端;所述第二客戶端用于向所述第二數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè) 務(wù)請求,所述第二數(shù)據(jù)服務(wù)客戶端用于根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;所述第二數(shù)據(jù)服務(wù)客戶端還用于調(diào)用所述第三數(shù)據(jù)服務(wù)客戶端,并且所述第三數(shù)據(jù)服務(wù)客戶端用于產(chǎn)生第一次業(yè)務(wù)請求,并根據(jù)所述業(yè)務(wù)請求產(chǎn)生與所述第二數(shù)據(jù)服務(wù)客戶端所產(chǎn)生的事務(wù)id相同的事務(wù)id;所述第三數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,并將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;所述第二數(shù)據(jù)服務(wù)端用于解析所述報(bào)文信息,并將業(yè)務(wù)請求放入請求隊(duì)列,并且在有空閑進(jìn)程時(shí),所述第二數(shù)據(jù)服務(wù)端還用于從請求隊(duì)列獲取所述業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端還用于判斷當(dāng)前的業(yè)務(wù)請求是否需要事務(wù)保持,若需要事務(wù)保持,則所述第三數(shù)據(jù)服務(wù)客戶端將當(dāng)前進(jìn)程只分配給具有相同的所述事務(wù)id的請求使用,若不需要事務(wù)保持,則釋放當(dāng)前進(jìn)程;所述第三客戶端還用于發(fā)起第二次業(yè)務(wù)請求,此時(shí)所述第三數(shù)據(jù)服務(wù)客戶端還用于產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id,并且根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端;所述第二數(shù)據(jù)服務(wù)端還用于解析所述報(bào)文信息,將對應(yīng)的請求放入請求隊(duì)列,并且判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端還用于將所述處理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;所述第二客戶端向第二數(shù)據(jù)服務(wù)客戶端發(fā)起第二次業(yè)務(wù)請求時(shí),所述第二數(shù)據(jù)服務(wù)客戶端還用于產(chǎn)生與上一次業(yè)務(wù)請求所產(chǎn)生的事務(wù)id相同事務(wù)id,并且根據(jù)所述事務(wù)id、對應(yīng)的操作命令以及綁定變量形成報(bào)文信息,之后將所述報(bào)文信息發(fā)送給第二數(shù)據(jù)服務(wù)端,所述第二數(shù)據(jù)服務(wù)端還用于解析所述報(bào)文信息,將對應(yīng)的請求放入請求隊(duì)列,并判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,則從所述請求隊(duì)列獲取對應(yīng)的業(yè)務(wù)請求,連接對應(yīng)的數(shù)據(jù)庫,利用所述獨(dú)占進(jìn)程執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第三數(shù)據(jù)服務(wù)客戶端;所述第三數(shù)據(jù)服務(wù)客戶端還用于將所述處 理結(jié)果響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端;對同一數(shù)據(jù)庫的業(yè)務(wù)完成之后,所述第二客戶端還用于向所述第二數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;所述第二數(shù)據(jù)服務(wù)客戶端還用于將所述提交請求的事務(wù)id設(shè)置為前一次業(yè)務(wù)請求的事務(wù)id;并向所述第三數(shù)據(jù)服務(wù)客戶端發(fā)起請求;所述第三數(shù)據(jù)服務(wù)客戶端還用于判斷當(dāng)前提交請求是否為自己發(fā)出的請求,若不是,則所述第三數(shù)據(jù)服務(wù)客戶端發(fā)聵預(yù)定響應(yīng)給所述第二數(shù)據(jù)服務(wù)客戶端,所述第二數(shù)據(jù)服務(wù)客戶端收到所述預(yù)定響應(yīng)后,還用于根據(jù)所述提交請求生成報(bào)文信息發(fā)送給對應(yīng)的所述第二數(shù)據(jù)服務(wù)端;所述第二數(shù)據(jù)服務(wù)端還用于根據(jù)接收的所述報(bào)文信息,連接對應(yīng)的數(shù)據(jù)庫,并判斷是否存在所述事務(wù)id的獨(dú)占進(jìn)程,若存在,利用所述獨(dú)占進(jìn)程執(zhí)行提交操作,并在提交完成后向所述第二數(shù)據(jù)服務(wù)客戶端飯反饋提交響應(yīng)。

下面通過幾個(gè)實(shí)施例對本發(fā)明進(jìn)行詳細(xì)的介紹。

圖5為本發(fā)明的一個(gè)較佳實(shí)施例一的保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng)結(jié)構(gòu)示意圖。此實(shí)施例用于實(shí)現(xiàn)對多個(gè)數(shù)據(jù)庫進(jìn)行一致性操作。此實(shí)施例的工作流程如下:

1、客戶端發(fā)起業(yè)務(wù)請求,數(shù)據(jù)服務(wù)(客戶端)負(fù)責(zé)生成總事務(wù)id,一次事務(wù)只生成一次事務(wù)只生成一個(gè)事務(wù)id且保證全系統(tǒng)唯一;

2、對于有事務(wù)操作的dml請求(update、insert、delete等),數(shù)據(jù)服務(wù)(客戶端)將報(bào)文信息(事務(wù)id、dml語句、綁定變量等)利用序列化工具進(jìn)行序列化,序列化后的信息稱重做(redo)日志,將重做(redo)日志緩存在本地內(nèi)存緩沖區(qū);對于無事務(wù)的請求(如select)不生成redo日志;

3、數(shù)據(jù)服務(wù)(客戶端)將請求報(bào)文(事務(wù)id、dml語句、綁定變量等)封裝打包后,發(fā)送給數(shù)據(jù)服務(wù)(dataservice)服務(wù)端;

4、數(shù)據(jù)服務(wù)(服務(wù)端)接收請求信息后,將報(bào)文反序列化,放入報(bào)文容器內(nèi),執(zhí)行該報(bào)文的dml語句,并將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(服務(wù)端),注意此時(shí)不自動(dòng)提交(commit),需要等數(shù)據(jù)服務(wù)(客戶端)對該事務(wù)id發(fā)起提交請求才成做提交處理;

5、根據(jù)業(yè)務(wù)需要,數(shù)據(jù)服務(wù)(客戶端)可多次調(diào)用不同的數(shù)據(jù)服務(wù)(服 務(wù)端),重復(fù)步驟2、步驟3和步驟4,直到業(yè)務(wù)完成;

6、只有所有數(shù)據(jù)服務(wù)處理成功,才能執(zhí)行下一步的提交操作,否則失敗回滾;

7、業(yè)務(wù)成功,數(shù)據(jù)服務(wù)(客戶端)根據(jù)本地內(nèi)存緩沖區(qū)記錄的重做(redo)日志,依次對數(shù)據(jù)服務(wù)(服務(wù)端)發(fā)起提交請求;數(shù)據(jù)服務(wù)(服務(wù)端)接收到提交請求后,記錄該事務(wù)id對應(yīng)的事務(wù)日志(目的是當(dāng)客戶端不確認(rèn)成功重做時(shí),用來做排重處理的,對于有記錄的表示已處理成功不需要重做,對于沒有記錄的,需要重做處理)和本事務(wù)id對應(yīng)的其他dml操作,一塊提交確認(rèn),響應(yīng)給數(shù)據(jù)服務(wù)(客戶端),提交成功后響應(yīng)成功,提交失敗響應(yīng)失敗。

8、如果第一個(gè)提交的數(shù)據(jù)服務(wù)(服務(wù)端)響應(yīng)失敗,數(shù)據(jù)服務(wù)(客戶端)放棄該業(yè)務(wù)回滾處理;

9、如果第一個(gè)提交的數(shù)據(jù)服務(wù)(服務(wù)端)響應(yīng)成功,其他后續(xù)的提交的數(shù)據(jù)服務(wù)(服務(wù)端)存在不確認(rèn)成功,數(shù)據(jù)服務(wù)(客戶端)將本地內(nèi)存緩沖區(qū)記錄的重做(redo)日志生成錯(cuò)誤文件,對外響應(yīng)成功,不確認(rèn)成功的操作,后續(xù)靠異步程序進(jìn)行redo平賬處理;

如果所有數(shù)據(jù)服務(wù)(服務(wù)端)響應(yīng)成功,數(shù)據(jù)服務(wù)(客戶端)清理該事務(wù)id對應(yīng)的本地內(nèi)存緩沖區(qū)記錄的重做(redo);下次業(yè)務(wù),重新生成一個(gè)事務(wù)id,重復(fù)以上操作。

圖6為本發(fā)明的一個(gè)較佳實(shí)施例二的多數(shù)據(jù)庫操作事務(wù)一致性保證方法的流程圖;如圖所示,該實(shí)施例包括以下步驟:

1、應(yīng)用app,即客戶端接收(或發(fā)起)dml(如select查詢)請求,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

2、數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id,并將dml請求1的sql語句及相關(guān)綁定變量裝入發(fā)送容器;

3、檢查該dml請求1是否有事務(wù),有事務(wù)則將請求報(bào)文序列化文件寫入內(nèi)存緩沖區(qū),生成重做(redo)日志;

4、數(shù)據(jù)服務(wù)(客戶端lib)與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接,通過socket接口將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);數(shù)據(jù)服務(wù)(客戶端 lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

5、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

6、當(dāng)有空閑的處理進(jìn)程時(shí),調(diào)度空閑進(jìn)程處理處理該任務(wù);如果沒有空閑進(jìn)程,該請求排隊(duì)等待;在此過程中,如果有其他應(yīng)用app發(fā)起socket接入和dml請求,采用相同處理,將請求放入隊(duì)列排隊(duì);

7、空閑處理進(jìn)程從請求隊(duì)列中獲取請求任務(wù),獲取數(shù)據(jù)庫連接,執(zhí)行dml((如select查詢))語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

8、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);

9、數(shù)據(jù)服務(wù)(客戶端lib)根據(jù)業(yè)務(wù)需求,對dml請求n重復(fù)執(zhí)行以上步驟2到步驟8的操作,直到所有dml請求都獲得執(zhí)行處理;

10、業(yè)務(wù)完成,應(yīng)用app發(fā)起提交處理,數(shù)據(jù)服務(wù)(客戶端lib)按事務(wù)id從內(nèi)存緩沖區(qū),讀取redo日志;

11、數(shù)據(jù)服務(wù)(客戶端lib)調(diào)用數(shù)據(jù)服務(wù)(服務(wù)端)進(jìn)行提交處理;數(shù)據(jù)服務(wù)(服務(wù)端)按事務(wù)id調(diào)用進(jìn)行提交處理;

12、數(shù)據(jù)服務(wù)(客戶端lib)重復(fù)執(zhí)行步驟11,提交所有事務(wù)的數(shù)據(jù)服務(wù)(服務(wù)端);

13、提交成功,處理結(jié)束。

圖7為本發(fā)明的一個(gè)較佳實(shí)施例二中回滾處理的流程圖,該實(shí)施例包括以下步驟:

1、應(yīng)用app接收(或發(fā)起)dml(如select查詢)請求,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

2、數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id,并將dml請求1的sql語句及相關(guān)綁定變量裝入發(fā)送容器;

3、檢查該dml請求1是否有事務(wù),有事務(wù)則將請求報(bào)文序列化文件寫入內(nèi)存緩沖區(qū),生成重做(redo)日志;

4、數(shù)據(jù)服務(wù)(客戶端lib)與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接, 通過socket接口將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

5、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

6、當(dāng)有空閑的處理進(jìn)程時(shí),調(diào)度空閑進(jìn)程處理處理該任務(wù);如果沒有空閑進(jìn)程,該請求排隊(duì)等待;在此過程中,如果有其他應(yīng)用app發(fā)起socket接入和dml請求,采用相同處理,將請求放入隊(duì)列排隊(duì);

7、空閑處理進(jìn)程從請求隊(duì)列中獲取請求任務(wù),獲取數(shù)據(jù)庫連接,執(zhí)行dml((如select查詢))語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

8、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);

9、數(shù)據(jù)服務(wù)(客戶端lib)根據(jù)業(yè)務(wù)需求,對dml請求n重復(fù)執(zhí)行以上步驟2到步驟8的操作,直到所有dml請求都獲得執(zhí)行處理;

10、如果其中一個(gè)dml請求n處理失敗,則認(rèn)為業(yè)務(wù)處理失??;

11、應(yīng)用app發(fā)起回滾處理,數(shù)據(jù)服務(wù)(客戶端lib)按事務(wù)id從內(nèi)存緩沖區(qū),讀取redo日志;

12、數(shù)據(jù)服務(wù)(客戶端lib)調(diào)用數(shù)據(jù)服務(wù)(服務(wù)端)進(jìn)行回滾處理;數(shù)據(jù)服務(wù)(服務(wù)端)按事務(wù)id調(diào)用進(jìn)行回滾處理;

13、數(shù)據(jù)服務(wù)(客戶端lib)重復(fù)執(zhí)行步驟11,回滾所有事務(wù)的數(shù)據(jù)服務(wù)(服務(wù)端);

14、回滾成功,處理結(jié)束。

圖8為本發(fā)明的一個(gè)較佳實(shí)施例二中異常處理的流程圖,該實(shí)施例包括以下步驟:

1、應(yīng)用app接收(或發(fā)起)dml(如select查詢)請求,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

2、數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id,并將dml請求1的sql語句及相關(guān)綁定變量裝入發(fā)送容器;

3、檢查該dml請求1是否有事務(wù),有事務(wù)則將請求報(bào)文序列化文件寫 入內(nèi)存緩沖區(qū),生成重做(redo)日志;

4、數(shù)據(jù)服務(wù)(客戶端lib)與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接,通過socket接口將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

5、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

6、當(dāng)有空閑的處理進(jìn)程時(shí),調(diào)度空閑進(jìn)程處理處理該任務(wù);如果沒有空閑進(jìn)程,該請求排隊(duì)等待;在此過程中,如果有其他應(yīng)用app發(fā)起socket接入和dml請求,采用相同處理,將請求放入隊(duì)列排隊(duì);

7、空閑處理進(jìn)程從請求隊(duì)列中獲取請求任務(wù),獲取數(shù)據(jù)庫連接,執(zhí)行dml((如select查詢))語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

8、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);

9、數(shù)據(jù)服務(wù)(客戶端lib)根據(jù)業(yè)務(wù)需求,對dml請求n重復(fù)執(zhí)行以上步驟2到步驟8的操作,直到所有dml請求都獲得執(zhí)行處理;

10、業(yè)務(wù)完成,應(yīng)用app發(fā)起提交處理,數(shù)據(jù)服務(wù)(客戶端lib)按事務(wù)id從內(nèi)存緩沖區(qū),讀取redo日志;

11、數(shù)據(jù)服務(wù)(客戶端lib)調(diào)用數(shù)據(jù)服務(wù)(服務(wù)端)進(jìn)行提交處理;數(shù)據(jù)服務(wù)(服務(wù)端)按事務(wù)id調(diào)用進(jìn)行提交處理;

12、數(shù)據(jù)服務(wù)(客戶端lib)重復(fù)執(zhí)行步驟11,提交所有事務(wù)的數(shù)據(jù)服務(wù)(服務(wù)端);

13、如果第一個(gè)數(shù)據(jù)服務(wù)(服務(wù)端)提交成功,第2~n(n代表最后一個(gè))個(gè)中任何一個(gè)數(shù)據(jù)服務(wù)(服務(wù)端)失敗,則數(shù)據(jù)服務(wù)(客戶端lib)讀取該事務(wù)id對應(yīng)的redo日志,生成異常文件,供異步平賬進(jìn)程重做處理;

14、后臺(tái)異步平賬進(jìn)程,讀取(redo日志)異常文件進(jìn)行重做處理,處理結(jié)束。

圖10為本發(fā)明的一個(gè)較佳實(shí)施例四的保證多數(shù)據(jù)庫操作事務(wù)一致性的方法流程圖,該實(shí)施例包括以下步驟:

1、應(yīng)用app接收(或發(fā)起)dml請求(如update語句),通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

2、數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id,并將dml對于的sql語句及相關(guān)綁定變量裝入發(fā)送容器;

3、數(shù)據(jù)服務(wù)(客戶端lib)將發(fā)送容器序列化處理,與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接,通過tcp/ip協(xié)議,將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);

4、數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

5、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

6、當(dāng)有空閑的處理進(jìn)程時(shí),調(diào)度空閑進(jìn)程處理處理該任務(wù);如果沒有空閑進(jìn)程,該請求排隊(duì)等待;在此過程中,如果有其他應(yīng)用app發(fā)起socket接入和dml請求,采用相同處理,將請求放入隊(duì)列排隊(duì);

7、空閑處理進(jìn)程從請求隊(duì)列中獲取請求任務(wù),獲取數(shù)據(jù)庫連接,執(zhí)行dml語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

8、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);

9、處理進(jìn)程檢查(剛完成響應(yīng)的)該dml語句是否需要事務(wù)保持(對于update、delete等需要提交的操作,都需要做事務(wù)保持),如果需要事務(wù)保持,則該處理進(jìn)程設(shè)置為“事務(wù)id”獨(dú)占模式,只處理事務(wù)id相同的請求,暫不處理其他事務(wù)id不一致的請求;如果不需要事務(wù)保持,則設(shè)置為空閑狀態(tài),以便調(diào)度進(jìn)程將新任務(wù)派發(fā)給自己;

10、應(yīng)用app再次發(fā)起dml(如update語句)請求,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

11、數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id為第一次請求的事務(wù)id以便事務(wù)重入(事務(wù)重入的目的可以看到相同事務(wù)id修改的“臟數(shù)據(jù)”),將dml對于的sql語句及相關(guān)綁定變量裝入發(fā)送容器;

12、數(shù)據(jù)服務(wù)(客戶端lib)將發(fā)送容器序列化處理,與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接(如果上次調(diào)用的socket沒有斷開可以復(fù)用),通過 tcp/ip協(xié)議,將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);

13、數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

14、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

15、檢查是否有該事務(wù)id已獨(dú)占的處理進(jìn)程,如果有則派發(fā)給該處理進(jìn)程。處理進(jìn)程得到事務(wù)id相同的處理任務(wù),獲取數(shù)據(jù)庫連接執(zhí)行dml語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

16、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);

17、數(shù)據(jù)服務(wù)(客戶端lib)將處理結(jié)果響應(yīng)給應(yīng)用app;

18、業(yè)務(wù)結(jié)束,應(yīng)用app發(fā)起提交調(diào)用到數(shù)據(jù)服務(wù)(客戶端lib),數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id為第一次請求的事務(wù)id以便事務(wù)重入;

19、數(shù)據(jù)服務(wù)(客戶端lib)將提交請求發(fā)送數(shù)據(jù)服務(wù)(服務(wù)端),數(shù)據(jù)服務(wù)(服務(wù)端),檢查是否有該事務(wù)id已獨(dú)占的處理進(jìn)程,如果有則將提交請求派發(fā)給該事務(wù)id已獨(dú)占的處理進(jìn)程;

20、該事務(wù)id已獨(dú)占的處理進(jìn)程提交完畢,數(shù)據(jù)服務(wù)(服務(wù)端)響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);該事務(wù)id已獨(dú)占的處理進(jìn)程釋放獨(dú)占,設(shè)置為空閑狀態(tài)以便處理其他請求調(diào)用。

上述實(shí)施例四的方法適合于圖9所示的系統(tǒng)進(jìn)行數(shù)據(jù)庫操作。如圖9所示,進(jìn)程app有兩個(gè)線程對應(yīng)兩次請求,例如一個(gè)線程thread1負(fù)責(zé)更新余額,更新前原值等于100元,增加100元更新后余額變成200元;另一個(gè)線程thread2負(fù)責(zé)查詢余額,在thread1先更新,thread2查詢,利用圖10所示流程圖對應(yīng)的方法可以確保thread2查詢到的是200元(可以看到這個(gè)臟數(shù)據(jù)),而不是100元。

圖12為本發(fā)明的一個(gè)較佳實(shí)施例六的保證數(shù)據(jù)庫操作事務(wù)一致性的方法流程圖,該實(shí)施例包括以下步驟:

1、服務(wù)a設(shè)置事務(wù)id(以下用uid標(biāo)示),發(fā)起業(yè)務(wù)調(diào)用,整個(gè)業(yè)務(wù)過程中事務(wù)id唯一,通過socket接口基于tcp/ip協(xié)議,調(diào)用服務(wù)b;

2、服務(wù)b接收服務(wù)a的調(diào)用請求,設(shè)置事務(wù)id為服務(wù)a傳入的uid,進(jìn)行業(yè)務(wù)處理,發(fā)起dml請求,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

3、服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id等于uid,并將dml對于的sql語句及相關(guān)綁定變量裝入發(fā)送容器;

4、服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib)將發(fā)送容器序列化處理,與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接,通過tcp/ip協(xié)議,將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);

5、服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

6、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

7、當(dāng)有空閑的處理進(jìn)程時(shí),調(diào)度空閑進(jìn)程處理處理該任務(wù);如果沒有空閑進(jìn)程,該請求排隊(duì)等待;在此過程中,如果有其他應(yīng)用發(fā)起socket接入和dml請求,采用相同處理,將請求放入隊(duì)列排隊(duì);

8、空閑處理進(jìn)程從請求隊(duì)列中獲取請求任務(wù),獲取數(shù)據(jù)庫連接,執(zhí)行dml語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

9、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib);

10、處理進(jìn)程檢查(剛完成響應(yīng)的)該dml語句是否需要事務(wù)保持,如果需要事務(wù)保持,則該處理進(jìn)程設(shè)置為“事務(wù)id”獨(dú)占模式,只處理事務(wù)id相同的請求,暫不處理其他事務(wù)id不一致的請求;如果不需要事務(wù)保持則設(shè)置為空閑狀態(tài),以便調(diào)度進(jìn)程將新任務(wù)派發(fā)給自己;

11、服務(wù)b根據(jù)業(yè)務(wù)需要再次發(fā)起dml請求,設(shè)置事務(wù)id等于uid,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);以便事務(wù)重入(事務(wù)重入的目的可以看到相同事務(wù)id修改的“臟數(shù)據(jù)”);

12、服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib)將發(fā)送容器序列化處理,與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接(如果上次調(diào)用的socket沒有斷開可以復(fù)用),通過tcp/ip協(xié)議,將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);

13、服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返 回應(yīng)答信息;

14、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

15、檢查是否有該事務(wù)id已獨(dú)占的處理進(jìn)程,如果有則派發(fā)給該處理進(jìn)程;

16、處理進(jìn)程得到事務(wù)id相同的處理任務(wù),獲取數(shù)據(jù)庫連接執(zhí)行dml語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

17、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給服務(wù)b的數(shù)據(jù)服務(wù)(客戶端lib);

18、數(shù)據(jù)服務(wù)(客戶端lib)將處理結(jié)果響應(yīng)給服務(wù)b;

19、服務(wù)b將處理結(jié)果響應(yīng)給服務(wù)a;

20、服務(wù)a根據(jù)業(yè)務(wù)需要再次發(fā)起dml請求,設(shè)置事務(wù)id等于uid,通過api接口傳遞數(shù)據(jù)服務(wù)(客戶端lib);

21、服務(wù)a的數(shù)據(jù)服務(wù)(客戶端lib)設(shè)置事務(wù)id為uid以便事務(wù)重入(事務(wù)重入的目的可以看到相同事務(wù)id修改的“臟數(shù)據(jù)”);

22、服務(wù)a的數(shù)據(jù)服務(wù)(客戶端lib)將發(fā)送容器序列化處理,與數(shù)據(jù)服務(wù)(服務(wù)端)建立socket套接字連接(如果上次調(diào)用的socket沒有斷開可以復(fù)用),通過tcp/ip協(xié)議,將請求報(bào)文發(fā)送給數(shù)據(jù)服務(wù)(服務(wù)端);

23、服務(wù)a的數(shù)據(jù)服務(wù)(客戶端lib)保持該socket連接,等待服務(wù)端返回應(yīng)答信息;

24、數(shù)據(jù)服務(wù)(服務(wù)端)端將請求放入請求隊(duì)列排隊(duì);

25、檢查是否有該事務(wù)id已獨(dú)占的處理進(jìn)程,如果有則派發(fā)給該處理進(jìn)程;

26、處理進(jìn)程得到事務(wù)id相同的處理任務(wù),獲取數(shù)據(jù)庫連接執(zhí)行dml語句,得到處理結(jié)果,將處理結(jié)果裝入服務(wù)端發(fā)送容器;

27、數(shù)據(jù)服務(wù)(服務(wù)端)將本端發(fā)送容器序列化,找到響應(yīng)請求包的socket套接字連接,將處理結(jié)果響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);

28、數(shù)據(jù)服務(wù)(客戶端lib)將處理結(jié)果響應(yīng)給服務(wù)a;

29、業(yè)務(wù)完成,服務(wù)a設(shè)置事務(wù)id等于uid,發(fā)起提交請求到服務(wù)b;

30、服務(wù)b檢查事務(wù)id等于uid不是自己發(fā)起的事務(wù),記錄自己相關(guān)dml操作的redo日志,直接響應(yīng)成功給服務(wù)a;

31、服務(wù)a收到服務(wù)b的正確響應(yīng)后,繼續(xù)處理,通過數(shù)據(jù)服務(wù)(客戶端lib)發(fā)送提交請求;

32、數(shù)據(jù)服務(wù)(客戶端lib)將提交請求發(fā)送數(shù)據(jù)服務(wù)(服務(wù)端),數(shù)據(jù)服務(wù)(服務(wù)端),檢查是否有該事務(wù)id已獨(dú)占的處理進(jìn)程,如果有則將提交請求派發(fā)給該事務(wù)id已獨(dú)占的處理進(jìn)程;

該事務(wù)id已獨(dú)占的處理進(jìn)程提交完畢,數(shù)據(jù)服務(wù)(服務(wù)端)響應(yīng)給數(shù)據(jù)服務(wù)(客戶端lib);該事務(wù)id已獨(dú)占的處理進(jìn)程釋放獨(dú)占,設(shè)置為空閑狀態(tài)以便處理其他請求調(diào)用。

33、提交成功,業(yè)務(wù)結(jié)束。

上述實(shí)施例六的方法適合于圖11所示的系統(tǒng)進(jìn)行數(shù)據(jù)庫操作。如圖11所示,服務(wù)a和服務(wù)b同時(shí)對一個(gè)數(shù)據(jù)庫進(jìn)行操作。例如更新前余額原值等于100元,服務(wù)a、b相互協(xié)調(diào)來完成一筆業(yè)務(wù),a啟動(dòng)一個(gè)事務(wù)id,進(jìn)程a增加100元更新后余額變成200元;進(jìn)程b更新余額增加200元余額變成400元。如果不支持事務(wù)重入,進(jìn)程a,進(jìn)程b對于同一數(shù)據(jù)庫的更新可能是兩個(gè)數(shù)據(jù)庫連接會(huì)話,造成結(jié)果不確定,可能是200元、300元、或400元,也可能因?yàn)榕龅綌?shù)據(jù)庫并發(fā)鎖沖突業(yè)務(wù)不成功。

若利用現(xiàn)有技術(shù)進(jìn)行處理面臨如下問題:

1、服務(wù)嵌套調(diào)用,同一數(shù)據(jù)庫多次操作的事務(wù)管理;

2、調(diào)用的時(shí)序問題;

3、同一個(gè)事務(wù)id,臟數(shù)據(jù)的可視性。

4、事務(wù)異常時(shí),最終一致性保證問題。

5、連接數(shù)的收斂問題。

通過利用圖12所示流程圖對應(yīng)的方法尅達(dá)到如下效果:服務(wù)嵌套調(diào)用,同一數(shù)據(jù)庫多次操作,通過獨(dú)占式數(shù)據(jù)服務(wù)進(jìn)程使用同一數(shù)據(jù)庫會(huì)話連接確保、事務(wù)無問題、操作時(shí)序無問題、同一個(gè)事務(wù)id臟數(shù)據(jù)的可視;通過數(shù)據(jù)服務(wù)(數(shù)據(jù)訪問層)進(jìn)行請求排隊(duì)和連接復(fù)用,達(dá)到數(shù)據(jù)庫連接數(shù)收斂的目的。

上述實(shí)施例通過新增加數(shù)據(jù)訪問層(dal)的數(shù)據(jù)服務(wù)(客戶端lib)和數(shù)據(jù)服務(wù)(服務(wù)端)這種c/s裝置,實(shí)現(xiàn)了數(shù)據(jù)連接數(shù)管理和收斂,同時(shí)還實(shí)現(xiàn)了對于同一事實(shí)id的,多次訪問同一數(shù)據(jù)庫的會(huì)話重入,確保同一事務(wù)內(nèi)的“臟數(shù)據(jù)”(未提交的中間數(shù)據(jù))對每次訪問都透明可見。

本發(fā)明通過數(shù)據(jù)訪問層(dal)實(shí)現(xiàn)多數(shù)據(jù)庫操作的事務(wù)一致性方法和裝置;通過數(shù)據(jù)訪問層(dal)實(shí)現(xiàn)同一線程(或進(jìn)程)訪問數(shù)據(jù)服務(wù),同一事務(wù)id多次操作的會(huì)話重入方法和裝置;通過數(shù)據(jù)訪問層(dal)實(shí)現(xiàn)服務(wù)嵌套調(diào)用的事務(wù)重入方法和裝置。總之本發(fā)明的技術(shù)方案具有如下有益效果:

1、提供了一個(gè)統(tǒng)一的數(shù)據(jù)服務(wù)(數(shù)據(jù)訪問層)支持對多個(gè)數(shù)據(jù)操作且能保證事務(wù)一致性,簡化應(yīng)用開發(fā)的復(fù)雜度。

2、能夠支持跨服務(wù)的數(shù)據(jù)庫連接會(huì)話重入,確保一個(gè)業(yè)務(wù)事務(wù)中,多個(gè)服務(wù)進(jìn)程(或線程)對同一數(shù)據(jù)的多次修改后臟數(shù)據(jù)(未做提交中間數(shù)據(jù))各個(gè)進(jìn)程(或線程)透明可見。

3、支持對于應(yīng)用和數(shù)據(jù)分離,應(yīng)用通過數(shù)據(jù)訪問層和多個(gè)數(shù)據(jù)庫交互,建設(shè)數(shù)據(jù)訪問層支持對dml操作的回滾和重做(redo),應(yīng)用層不用處理路由管理和事務(wù)管理,從而簡化應(yīng)用,降低開發(fā)成本。

以上所述是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明所述原理的前提下,還可以作出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1