国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

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

      文檔序號:11276403閱讀:442來源:國知局
      數(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)營時代的到來,當(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)橄拗铺啵炜s性的太差;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ù)庫會話(session),不能保證數(shù)據(jù)資源的透明訪問(提交前的中間數(shù)據(jù)只能在同一會話session內(nèi)看得到)。同時應(yīng)用直接連接多個數(shù)據(jù)源,每個應(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ù)請求包括對多個數(shù)據(jù)庫進(jìn)行操作的多個子請求;一次所述業(yè)務(wù)請求對應(yīng)一個所述事務(wù)id;

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

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

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

      s1023、所述第一數(shù)據(jù)服務(wù)端在有空閑進(jìn)程時從所述請求隊(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ù)所述提交請求,對于每一個處理成功的所述子請求,依次執(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中,若接收的第一個所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則根據(jù)對應(yīng)的所述重做日志生成錯誤文件,供異步平賬 進(jìn)程重做處理;

      所述步驟s1043中,若接收的第一個所述提交結(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)處理過的每個所述子請求做對應(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ù)請求時,所述方法還包括以下步驟:

      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)程時從所述請求隊(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ù)據(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)包括第一客戶端、若干個數(shù)據(jù)庫、第一數(shù)據(jù)服務(wù)客戶端以及第一數(shù)據(jù)服務(wù)端;

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

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

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

      所述第一數(shù)據(jù)服務(wù)端用于解析所述報(bào)文信息,并將對應(yīng)的子請求放入請求隊(duì)列,并且在有空閑進(jìn)程時,所述第一數(shù)據(jù)服務(wù)端還用于從所述請求隊(duì)列獲取所述子請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;在所有事務(wù)的所述子請求均處理成功,則所述第一客戶端還用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;對于每一個處理成功的所述子請求,所述第一數(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ù)客戶端接收的第一個所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)對應(yīng)的所述重做日志生成錯誤文件,供異步平賬進(jìn)程重做處理;

      至少一個所述子請求在執(zhí)行對應(yīng)的所述操作命令時出現(xiàn)異常時,所述第一數(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ù)據(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ù)據(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ù)據(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)行存儲,并將該業(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ù)一致性。多個用戶多次對數(shù)據(jù)庫進(jìn)行操作時,數(shù)據(jù)服務(wù)端對各個業(yè)務(wù)請求是否需要進(jìn)行業(yè)務(wù)保持進(jìn)行記錄,并為需要業(yè)務(wù)保持的請求分配獨(dú)占進(jìn)程,該獨(dú)占進(jìn)程只分配給特定事務(wù)id的請求使用,從而通過事務(wù)id的設(shè)置在多用戶多次操作數(shù)據(jù)庫以及提交時能夠保證事務(wù)的一致性。本發(fā)明支持對多個數(shù)據(jù)操作且能保證事務(wù)一致性,簡化應(yīng)用開發(fā)的復(fù)雜度;同時本發(fā)明支持對dml操作的回滾和重做(redo),應(yīng)用層不用處理路由管理和事務(wù)管理,從而簡化應(yīng)用,降低開發(fā)成本。另外,本發(fā)明支持跨服務(wù)的數(shù)據(jù)庫連接會話重入,確保一個業(yè)務(wù)事務(wù)中,多個服務(wù)進(jìn)程(或線程)對同一數(shù)據(jù)的多次修改后臟數(shù)據(jù)(未做提交中間數(shù)據(jù))各個進(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ā)明的一個較佳實(shí)施例一的保證多數(shù)據(jù)庫操作事務(wù)一致性的系統(tǒng)結(jié)構(gòu)示意圖;

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

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

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

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

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

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

      圖12為本發(fā)明的一個較佳實(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ù)請求包括對多個數(shù)據(jù)庫進(jìn)行操作的多個子請求;一次所述業(yè)務(wù)請求對應(yīng)一個所述事務(wù)id;

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

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

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

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

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

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

      s104、所述第一數(shù)據(jù)服務(wù)客戶端根據(jù)所述提交請求,進(jìn)行提交操作,具體地對于每一個處理成功的所述子請求,依次執(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中,若接收的第一個所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則根據(jù)對應(yīng)的所述重做日志生成錯誤文件,供異步平賬進(jìn)程重做處理;

      所述步驟s1043中,若接收的第一個所述提交結(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)處理過的每個所述子請求做對應(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ù)請求時,所述方法還包括以下步驟:

      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)程時從所述請求隊(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ù)據(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)包括第一客戶端、若干個數(shù)據(jù)庫、第一數(shù)據(jù)服務(wù)客戶端以及第一數(shù)據(jù)服務(wù)端;所述第一客戶端用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起業(yè)務(wù)請求;所述第一數(shù)據(jù)服務(wù)客戶端用于根據(jù)所述業(yè)務(wù)請求生成事務(wù)id;其中所述業(yè)務(wù)請求包括對多個數(shù)據(jù)庫進(jìn)行操作的多個子請求;一次所述業(yè)務(wù)請求對應(yīng)一個所述事務(wù)id;所述第一數(shù)據(jù)服務(wù)客戶端還用于檢查所述子請求是否有事務(wù),對于每一個有事務(wù)的所述子請求,所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)所述事務(wù)id、對應(yīng)于所述子請求的操作命令以及綁定變量形成報(bào)文信息,將所述報(bào)文信息序列化生成重做日志,之后存儲所述重做日志并將所述報(bào)文信息發(fā)送給所述第一數(shù)據(jù)服務(wù)端;所述第一數(shù)據(jù)服務(wù)端用于解析所述報(bào)文信息,并將對應(yīng)的子請求放入請求隊(duì)列,并且在有空閑進(jìn)程時,所述第一數(shù)據(jù)服務(wù)端 還用于從所述請求隊(duì)列獲取所述子請求,連接對應(yīng)的數(shù)據(jù)庫,并執(zhí)行對應(yīng)的所述操作命令,獲得處理結(jié)果,并將所述處理結(jié)果響應(yīng)給所述第一數(shù)據(jù)服務(wù)客戶端;在所有事務(wù)的所述子請求均處理成功,則所述第一客戶端還用于向所述第一數(shù)據(jù)服務(wù)客戶端發(fā)起提交請求;對于每一個處理成功的所述子請求,所述第一數(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ù)訪問層,多個應(yīng)用位于應(yīng)用層,數(shù)據(jù)庫層包括若干個內(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ù)客戶端接收的第一個所述提交結(jié)果為成功,并且存在提交結(jié)果為失敗,則所述第一數(shù)據(jù)服務(wù)客戶端還用于根據(jù)對應(yīng)的所述重做日志生成錯誤文件,供異步平賬進(jìn)程重做處理;

      至少一個所述子請求在執(zhí)行對應(yīng)的所述操作命令時出現(xiàn)異常時,所述第一數(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ù)據(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ù)據(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ù)據(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)。

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

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

      1、客戶端發(fā)起業(yè)務(wù)請求,數(shù)據(jù)服務(wù)(客戶端)負(fù)責(zé)生成總事務(wù)id,一次事務(wù)只生成一次事務(wù)只生成一個事務(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ù)端),注意此時不自動提交(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)成功重做時,用來做排重處理的,對于有記錄的表示已處理成功不需要重做,對于沒有記錄的,需要重做處理)和本事務(wù)id對應(yīng)的其他dml操作,一塊提交確認(rèn),響應(yīng)給數(shù)據(jù)服務(wù)(客戶端),提交成功后響應(yīng)成功,提交失敗響應(yīng)失敗。

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

      9、如果第一個提交的數(shù)據(jù)服務(wù)(服務(wù)端)響應(yīng)成功,其他后續(xù)的提交的數(shù)據(jù)服務(wù)(服務(wù)端)存在不確認(rèn)成功,數(shù)據(jù)服務(wù)(客戶端)將本地內(nèi)存緩沖區(qū)記錄的重做(redo)日志生成錯誤文件,對外響應(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ù),重新生成一個事務(wù)id,重復(fù)以上操作。

      圖6為本發(fā)明的一個較佳實(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)程時,調(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ā)明的一個較佳實(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)程時,調(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、如果其中一個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ā)明的一個較佳實(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)程時,調(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、如果第一個數(shù)據(jù)服務(wù)(服務(wù)端)提交成功,第2~n(n代表最后一個)個中任何一個數(shù)據(jù)服務(wù)(服務(wù)端)失敗,則數(shù)據(jù)服務(wù)(客戶端lib)讀取該事務(wù)id對應(yīng)的redo日志,生成異常文件,供異步平賬進(jìn)程重做處理;

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

      圖10為本發(fā)明的一個較佳實(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)程時,調(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有兩個線程對應(yīng)兩次請求,例如一個線程thread1負(fù)責(zé)更新余額,更新前原值等于100元,增加100元更新后余額變成200元;另一個線程thread2負(fù)責(zé)查詢余額,在thread1先更新,thread2查詢,利用圖10所示流程圖對應(yīng)的方法可以確保thread2查詢到的是200元(可以看到這個臟數(shù)據(jù)),而不是100元。

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

      1、服務(wù)a設(shè)置事務(wù)id(以下用uid標(biāo)示),發(fā)起業(yè)務(wù)調(diào)用,整個業(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)程時,調(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ù)據(jù)庫進(jìn)行操作。例如更新前余額原值等于100元,服務(wù)a、b相互協(xié)調(diào)來完成一筆業(yè)務(wù),a啟動一個事務(wù)id,進(jìn)程a增加100元更新后余額變成200元;進(jìn)程b更新余額增加200元余額變成400元。如果不支持事務(wù)重入,進(jìn)程a,進(jìn)程b對于同一數(shù)據(jù)庫的更新可能是兩個數(shù)據(jù)庫連接會話,造成結(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)用的時序問題;

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

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

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

      通過利用圖12所示流程圖對應(yīng)的方法尅達(dá)到如下效果:服務(wù)嵌套調(diào)用,同一數(shù)據(jù)庫多次操作,通過獨(dú)占式數(shù)據(jù)服務(wù)進(jìn)程使用同一數(shù)據(jù)庫會話連接確保、事務(wù)無問題、操作時序無問題、同一個事務(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í)現(xiàn)了對于同一事實(shí)id的,多次訪問同一數(shù)據(jù)庫的會話重入,確保同一事務(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多次操作的會話重入方法和裝置;通過數(shù)據(jù)訪問層(dal)實(shí)現(xiàn)服務(wù)嵌套調(diào)用的事務(wù)重入方法和裝置。總之本發(fā)明的技術(shù)方案具有如下有益效果:

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

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

      3、支持對于應(yīng)用和數(shù)據(jù)分離,應(yīng)用通過數(shù)據(jù)訪問層和多個數(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條留言
      • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
      1