分布式事務(wù)處理方法及裝置的制造方法
【專利摘要】本申請?zhí)峁┮环N分布式事務(wù)處理方法及裝置,該方法包括:判斷所述分布式事務(wù)各個事務(wù)分支的執(zhí)行是否可以重試,并根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理;當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或回滾。根據(jù)本申請的技術(shù)方案,針對分布式事務(wù)配置可以重試的事務(wù)分支和不可重試的事務(wù)分支,對于可以重試的分支不立即執(zhí)行,而是直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果,從而較快的進(jìn)入事務(wù)的全局提交或回滾階段;事務(wù)提交階段再執(zhí)行可以重試的分支,異步推進(jìn)分布式事務(wù)的提交,既保證了事務(wù)的成功率,又不影響事務(wù)的最終一致。
【專利說明】
分布式事務(wù)處理方法及裝置
技術(shù)領(lǐng)域
[0001]本申請涉及分布式事務(wù)處理領(lǐng)域,尤其涉及一種分布式事務(wù)處理方法及裝置。
【背景技術(shù)】
[0002]事務(wù)是一個不可分割的工作單位,一個分布式事務(wù)通常包含多個本地事務(wù),各個本地事務(wù)要么都執(zhí)行,要么都不執(zhí)行,舉例來說,假設(shè)數(shù)據(jù)庫A上的操作1、數(shù)據(jù)庫B上的操作2、數(shù)據(jù)庫C上的操作3在一個分布式事務(wù),傳統(tǒng)的分布式事務(wù)處理上只有三個操作都執(zhí)行成功,這個分布式事務(wù)才成功。然而,在很多實(shí)際業(yè)務(wù)中,三個操作的關(guān)鍵級別并不是一樣的,有的要求立即成功,即,調(diào)用返回時已經(jīng)成功,有的只要求最終成功。
[0003]現(xiàn)有的解決分布式事務(wù)問題的方案有:XA兩階段提交協(xié)議、三階段提交協(xié)議等,然而,這些方案都不支持事務(wù)分支的重試級別配置。以其中應(yīng)用最為廣泛也最成熟的XA兩階段提交協(xié)議為例,兩階段提交中的第一階段是表決階段,所有參與者都將本事務(wù)能否成功的反饋發(fā)送給協(xié)調(diào)者;第二階段是執(zhí)行階段,協(xié)調(diào)者根據(jù)所有參與者的反饋,如果收到的所有反饋都是成功,則通知所有參與者,步調(diào)一致地在所有分支上提交,如果收到的任一反饋是失敗,則通知所有參與者在所有分支上回滾。
[0004]對XA協(xié)議來說,參與分布式事務(wù)的各個事務(wù)分支是平等的,不存在關(guān)鍵分支和非關(guān)鍵分支,這就造成了 XA協(xié)議在一些應(yīng)用場景下的局限性。XA兩階段提交協(xié)議是一個阻塞協(xié)議,當(dāng)一個節(jié)點(diǎn)在等待回復(fù)消息時進(jìn)入阻塞狀態(tài),其他需要這些資源的事務(wù)需要等待。也就是說,如果一個事務(wù)邏輯上有N-1個重要分支和I個不重要分支(不需要立即成功的),當(dāng)不重要分支遲遲未完成,所有分支都必須等待,N個分支的資源都沒有釋放,依賴任何一個資源的事務(wù)都無法繼續(xù)。
[0005]舉個例子,一個分布式事務(wù)包括操作1、操作2和操作3,其中,操作I和操作2要求必須立即成功,而操作3不要求立即成功,若不成功可以稍后重試,使用XA兩階段提交協(xié)議時,假如操作1、2在第一階段表決為成功,但是由于某些原因引起操作3失敗,XA只能認(rèn)為事務(wù)失敗,則操作1、2在第二階段回滾。這對實(shí)際業(yè)務(wù)來說,并不是合理、有效的,在實(shí)際業(yè)務(wù)中,不應(yīng)該因?yàn)橐恍┎魂P(guān)鍵的操作而讓主業(yè)務(wù)失敗。
[0006]為了避免上面問題,XA有一種解決方案是把操作I和操作2放在一個事務(wù)中執(zhí)行,這個事務(wù)執(zhí)行成功了,再執(zhí)行操作3,然而,如果操作3失敗了,則必須用很多冗余的技術(shù)手段來保證重試和最終成功,而且無法做到嚴(yán)格一致,例如,如果這個事務(wù)成功后,操作3還沒執(zhí)行就宕機(jī)了,則操作3永遠(yuǎn)無法執(zhí)行,而操作1、2也無法回滾,將會造成數(shù)據(jù)的不一致。
[0007]綜上所述,需要提出一種分布式事務(wù)的處理方案,以解決上述的問題。
【發(fā)明內(nèi)容】
[0008]本申請的主要目的在于提供一種分布式事務(wù)處理方法及裝置,以解決現(xiàn)有技術(shù)存在的解決分布式事務(wù)中由于事務(wù)分支級別都平等而導(dǎo)致不重要的事務(wù)分支的執(zhí)行影響事務(wù)的全局提交的問題,其中:
[0009]本申請的一個方面提供了一種分布式事務(wù)處理方法,包括:判斷所述分布式事務(wù)各個事務(wù)分支的執(zhí)行是否可以重試,并根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理;當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或回滾。
[0010]根據(jù)本申請,在該方法中,根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理,包括:如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果;如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果。
[0011]根據(jù)本申請,在該方法中,執(zhí)行所述分布式事務(wù)的提交或回滾,包括:根據(jù)接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的提交;或者根據(jù)接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的回滾。
[0012]根據(jù)本申請,在該方法中,執(zhí)行所述分布式事務(wù)的提交,包括:對于所述分布式事務(wù)中可以重試的事務(wù)分支,根據(jù)所述事務(wù)分支創(chuàng)建子事務(wù),并執(zhí)行所創(chuàng)建的子事務(wù),當(dāng)所述子事務(wù)執(zhí)行成功時,提交所述子事務(wù);對于所述分布式事務(wù)中不可重試的事務(wù)分支,提交所述事務(wù)分支,并清理相應(yīng)的事務(wù)分支日志。
[0013]根據(jù)本申請,在該方法中,執(zhí)行所創(chuàng)建的子事務(wù),包括:如果所述子事務(wù)執(zhí)行失敗,則對所述子事務(wù)進(jìn)行重試,直到所述子事務(wù)執(zhí)行成功。
[0014]根據(jù)本申請,在該方法中,還包括:向服務(wù)器上報各個事務(wù)分支的提交結(jié)果。
[0015]根據(jù)本申請,在該方法中,執(zhí)行所述分布式事務(wù)的回滾,包括:對于所述分布式事務(wù)中不可重試的事務(wù)分支,執(zhí)行所述事務(wù)分支的回滾;對于所述分布式事務(wù)中可以重試的事務(wù)分支,清除相應(yīng)的事務(wù)分支日志。
[0016]本申請的另一個方面提供了一種分布式事務(wù)處理裝置,包括:判斷模塊,用于判斷所述分布式事務(wù)各個事務(wù)分支的執(zhí)行是否可以重試;處理模塊,用于根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理;執(zhí)行模塊,用于當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或回滾。
[0017]根據(jù)本申請,在該裝置中,所述處理模塊,進(jìn)一步用于:如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果;如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果。
[0018]根據(jù)本申請,在該裝置中,所述執(zhí)行模塊,包括:提交模塊,用于根據(jù)接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的提交;或者回滾模塊,用于根據(jù)接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的回滾。
[0019]根據(jù)本申請,在該裝置中,所述提交模塊,包括:第一提交子模塊,用于對于所述分布式事務(wù)中可以重試的事務(wù)分支,根據(jù)所述事務(wù)分支創(chuàng)建子事務(wù),并執(zhí)行所創(chuàng)建的子事務(wù),當(dāng)所述子事務(wù)執(zhí)行成功時,提交所述子事務(wù);第二提交子模塊,用于對于所述分布式事務(wù)中不可重試的事務(wù)分支,提交所述事務(wù)分支,并清理相應(yīng)的事務(wù)分支日志。
[0020]根據(jù)本申請,在該裝置中,所述第一提交子模塊,進(jìn)一步用于:如果所述子事務(wù)執(zhí)行失敗,則對所述子事務(wù)進(jìn)行重試,直到所述子事務(wù)執(zhí)行成功。
[0021 ] 根據(jù)本申請,在該裝置中,還包括:上報模塊,用于向服務(wù)器上報各個事務(wù)分支的提交結(jié)果。
[0022]根據(jù)本申請,在該裝置中,所述回滾模塊,包括:第一回滾子模塊,用于對于所述分布式事務(wù)中不可重試的事務(wù)分支,執(zhí)行所述事務(wù)分支的回滾;第二回滾子模塊,用于對于所述分布式事務(wù)中可以重試的事務(wù)分支,清除相應(yīng)的事務(wù)分支日志。
[0023]與現(xiàn)有技術(shù)相比,根據(jù)本申請的技術(shù)方案,針對分布式事務(wù)通過配置可以重試的事務(wù)分支和不可重試的事務(wù)分支,將不要求立即成功的事務(wù)分支設(shè)置為可以重試的分支,在處理分布式事務(wù)時,對于可以重試的事務(wù)分支,不立即執(zhí)行,而是直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果,對于不可重試的事務(wù)分支,執(zhí)行后向服務(wù)器上報該分支的執(zhí)行結(jié)果,從而較快的進(jìn)入全局事務(wù)提交或回滾階段。在事務(wù)分支提交階段,執(zhí)行分布式事務(wù)中可以重試的事務(wù)分支,異步推進(jìn)分布式事務(wù)的提交,既保證了事務(wù)的成功率,又不影響事務(wù)的最終一致。
【附圖說明】
[0024]此處所說明的附圖用來提供對本申請的進(jìn)一步理解,構(gòu)成本申請的一部分,本申請的示意性實(shí)施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:
[0025]圖1是本申請實(shí)施例的分布式事務(wù)處理方法的流程圖;
[0026]圖2是根據(jù)本申請一個實(shí)施例的執(zhí)行根據(jù)可以重試的分支創(chuàng)建的子事務(wù)的流程圖;
[0027]圖3是根據(jù)本申請一個實(shí)施例的分布式事務(wù)處理方法的流程圖;
[0028]圖4是根據(jù)本申請一個實(shí)施例的對分布式事務(wù)的單個事務(wù)分支進(jìn)行提交的流程圖;以及
[0029]圖5是根據(jù)本申請實(shí)施例的分布式事務(wù)處理裝置的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0030]本申請的主要思想在于,在分布式事務(wù)中配置可以重試的事務(wù)分支(不要求立即成功的事務(wù)分支)和不可重試的事務(wù)分支(要求立即成功的事務(wù)分支),從而根據(jù)事務(wù)分支是否可以重試對各個分支進(jìn)行相應(yīng)的處理,對于可以重試的事務(wù)分支,不立即執(zhí)行,而是直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果,對于不可重試的事務(wù)分支,執(zhí)行后向服務(wù)器上報該分支的執(zhí)行結(jié)果,從而較快的進(jìn)入全局事務(wù)提交或回滾階段,并在全局提交或回滾階段執(zhí)行可以重試的事務(wù)分支,解決分布式事務(wù)中由于不同的事務(wù)分支級別平等而導(dǎo)致不重要的事務(wù)分支影響全局提交的問題。
[0031]為使本申請的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本申請具體實(shí)施例及相應(yīng)的附圖對本申請技術(shù)方案進(jìn)行清楚、完整地描述。顯然,所描述的實(shí)施例僅是本申請一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾堉械膶?shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本申請保護(hù)的范圍。
[0032]在一個典型的配置中,計算設(shè)備包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
[0033]內(nèi)存可能包括計算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計算機(jī)可讀介質(zhì)的示例。
[0034]計算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲。信息可以是計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)、動態(tài)隨機(jī)存取存儲器(DRAM)、其他類型的隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。
[0035]還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
[0036]本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請的實(shí)施例可提供為方法、系統(tǒng)、或計算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請可采用在一個或多個其中包含有計算機(jī)可用程序代碼的計算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實(shí)施的計算機(jī)程序產(chǎn)品的形式。
[0037]根據(jù)本申請的實(shí)施例,提供了一種分布式事務(wù)的處理方法。
[0038]參考圖1,圖1是本申請實(shí)施例的分布式事務(wù)的處理方法的流程圖。
[0039]在步驟SllO處,判斷所述分布式事務(wù)的各個事務(wù)分支的執(zhí)行是否可以重試,并根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理。
[0040]其中,每個事務(wù)分支的執(zhí)行是否可以重試,例如可以根據(jù)該事務(wù)分支是否要求立即成功來進(jìn)行判斷,如果該事務(wù)分支要求立即成功,則該事務(wù)分支的執(zhí)行不可以重試;如果該事務(wù)分支不要求立即成功,則該事務(wù)分支的執(zhí)行可以重試。
[0041]例如,假設(shè)將“賬戶A向賬戶B轉(zhuǎn)賬”作為一個分布式事務(wù),則需要在三個數(shù)據(jù)庫上進(jìn)行寫操作(也即是說,該事務(wù)可以分成三個事務(wù)分支),分別為:
[0042]1、在數(shù)據(jù)庫I上給賬戶A扣掉預(yù)定金額;
[0043]2、在數(shù)據(jù)庫2上給賬戶B加上相應(yīng)金額;
[0044]3、在數(shù)據(jù)庫3上進(jìn)行轉(zhuǎn)賬匯總。
[0045]其中,操作I和操作2要求必須立即成功,為不可重試的事務(wù)分支,而操作3并不要求立即成功,可以稍后重試,為可重試的事務(wù)分支。類似操作3這樣進(jìn)行數(shù)據(jù)匯總或統(tǒng)計的操作,只需要在數(shù)據(jù)庫中寫入一條記錄,執(zhí)行失敗大多是由于網(wǎng)絡(luò)故障等原因,因此,這樣的事務(wù)分支在一定程度上是可以保證會必然成功,可以將這類只要求最終成功,而不要求立即成功,且在一定程度上能夠保證其一定會成功的事務(wù)分支設(shè)置為可以重試的事務(wù)分支。
[0046]根據(jù)本申請的實(shí)施例,可以預(yù)先配置事務(wù)分支是否可以重試的判斷規(guī)則,例如,預(yù)先根據(jù)大量的歷史數(shù)據(jù)配置分支可以重試的各種情形,配置判斷分支是否可以重試的判斷規(guī)則,從而可以根據(jù)預(yù)先配置的判斷規(guī)則,判斷所述分布式事務(wù)的各個事務(wù)分支是否可以重試。
[0047]需要說明的是,各個事務(wù)分支可能需要在不同的數(shù)據(jù)庫中執(zhí)行,對分布式事務(wù)的各個事務(wù)分支是否可以重試的判斷以及根據(jù)判斷結(jié)果進(jìn)行處理可以異步進(jìn)行,也可以并行地進(jìn)行。
[0048]根據(jù)本申請的一個實(shí)施例,根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理,可以包括以下的處理方式:
[0049](I)如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果。
[0050]對于可以重試的事務(wù)分支,由于不要求立即成功,可以重試,因此,在一定才程度上保證了該事務(wù)分支必然能夠執(zhí)行成功,則向服務(wù)器注冊該事務(wù)分支后,不去執(zhí)行該分支,而直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果。
[0051](2)如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果。
[0052]對于不可重試的事務(wù)分支,向服務(wù)器注冊該事務(wù)分支后,去執(zhí)行該分支,并在執(zhí)行該分支后向服務(wù)器上報該分支的執(zhí)行結(jié)果,即,向服務(wù)器上報該分支執(zhí)行成功或執(zhí)行失敗的執(zhí)行結(jié)果。
[0053]通過上述處理方式,在處理分布式事務(wù)時,對于可以重試的事務(wù)分支,不立即執(zhí)行,而是直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果,對于不可重試的事務(wù)分支,執(zhí)行后向服務(wù)器上報該分支的執(zhí)行結(jié)果,從而能夠較快地進(jìn)入分布式事務(wù)的提交階段。
[0054]在步驟S120處,當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或者回滾。
[0055]根據(jù)本申請的實(shí)施例,向服務(wù)器上報所有分支的執(zhí)行結(jié)果后,服務(wù)器端作為協(xié)調(diào)者,根據(jù)接收到的各個事務(wù)分支的執(zhí)行結(jié)果決定發(fā)起該分布式事務(wù)的提交或回滾,具體地,如果所述分布式事務(wù)的所有的事務(wù)分支的執(zhí)行結(jié)果都是執(zhí)行成功,則確定對所述分布式事務(wù)進(jìn)行提交,如果所有的事務(wù)分支中至少存在一個執(zhí)行結(jié)果為執(zhí)行失敗的事務(wù)分支,則確定對所述分布式事務(wù)進(jìn)行回滾。具體而言,服務(wù)器確定了對分布式事務(wù)進(jìn)行提交或回滾后,向各個事務(wù)分支發(fā)送分支提交命令或回滾命令,發(fā)起全局事務(wù)的提交或回滾。因此,可以根據(jù)接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的提交;或者根據(jù)接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的回滾。也即是說,如果接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,則執(zhí)行所述分布式事務(wù)的提交;如果接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,則執(zhí)行所述分布式事務(wù)的回滾。
[0056]根據(jù)本申請的一個實(shí)施例,在接收到服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令的情況下,執(zhí)行所述分布式事務(wù)的提交的步驟可以包括以下情形:
[0057](I)對于所述分布式事務(wù)中可以重試的事務(wù)分支,根據(jù)所述事務(wù)分支創(chuàng)建子事務(wù),并執(zhí)行所創(chuàng)建的子事務(wù),當(dāng)所述子事務(wù)執(zhí)行成功時,提交所述子事務(wù)。如果當(dāng)前處理的分支可以重試,則針對該事務(wù)創(chuàng)建一個子事務(wù),并執(zhí)行該子事務(wù),其中,執(zhí)行所創(chuàng)建的子事務(wù)時,如果所述子事務(wù)執(zhí)行失敗,則對所述子事務(wù)進(jìn)行重試,直到所述子事務(wù)執(zhí)行成功。具體而言,由于可以重試的事務(wù)分支為不要求立即成功,且為必然會成功的分支,因此,如果所述子事務(wù)執(zhí)行失敗,則可以對所述子事務(wù)進(jìn)行異步重試,直到所述子事務(wù)執(zhí)行成功,則提交該子事務(wù)。
[0058]參考圖2,圖2是根據(jù)本申請一個實(shí)施例的執(zhí)行根據(jù)可以重試的分支創(chuàng)建的子事務(wù)的流程圖。
[0059]更具體而言,執(zhí)行一個子事務(wù)可以包括以下的步驟:
[0060]步驟S210,執(zhí)行該子事務(wù)的一個分支。其中,每個子事務(wù)可能包括多個事務(wù)分支。
[0061]步驟S220,判斷所執(zhí)行的分支是否執(zhí)行成功。如果執(zhí)行成功,則返回步驟S210,繼續(xù)執(zhí)行該子事務(wù)的其他分支;如果執(zhí)行失敗,執(zhí)行步驟S230。
[0062]步驟S230,向服務(wù)器發(fā)送該分支的執(zhí)行數(shù)據(jù)。該執(zhí)行數(shù)據(jù)例如可以為該分支執(zhí)行成功后的最終結(jié)果數(shù)據(jù),例如,如果為SQL事務(wù),則解釋所執(zhí)行的分支的SQL語句并向服務(wù)器發(fā)送,由服務(wù)器接收到該執(zhí)行數(shù)據(jù),發(fā)起該分支的異步重試,該分支可能被服務(wù)器發(fā)送到當(dāng)前執(zhí)行者重新執(zhí)行,也可能被服務(wù)器發(fā)送到其他執(zhí)行者執(zhí)行,但該分支最終會執(zhí)行成功。
[0063]步驟S240,判斷該子事務(wù)是否存在未執(zhí)行的分支,如果存在,則返回步驟S210繼續(xù)執(zhí)行尚未執(zhí)行的分支;如果不存在未執(zhí)行的分支,則該子事務(wù)執(zhí)行完畢(執(zhí)行成功),進(jìn)行步驟S250。
[0064]步驟S250,提交所述子事務(wù)。
[0065](2)對于所述分布式事務(wù)中不可重試的事務(wù)分支,提交所述事務(wù)分支,并清理相應(yīng)的事務(wù)分支日志。
[0066]對于不可重試的分支,由于已經(jīng)真正執(zhí)行過,如果接收到服務(wù)器發(fā)送的提交命令,表明該分布式事務(wù)中不可重試的分支都執(zhí)行成功,因此,可以直接提交該事務(wù)分支,并清理該事務(wù)分支的相應(yīng)的事務(wù)分支日志。
[0067]通過執(zhí)行步驟S120,在事務(wù)分支提交階段,執(zhí)行分布式事務(wù)中可以重試的事務(wù)分支,異步推進(jìn)分布式事務(wù)的提交,既保證了事務(wù)的成功率,又不影響事務(wù)的最終一致。
[0068]根據(jù)本申請的一個實(shí)施例,該方法還可以包括:向服務(wù)器上報各個事務(wù)分支的提交結(jié)果的步驟,也即是說,提交了某個事務(wù)分支之后向服務(wù)器上報該分支的提交結(jié)果,具體而言,在接收到服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令的情況下,表明該分布式事務(wù)的所有分支都執(zhí)行成功了(不可重試的分支執(zhí)行成功,可重試的分支必然成功),因此,針對每個事務(wù)分支向服務(wù)器上報的提交結(jié)果,為該事務(wù)分支提交成功的提交結(jié)果。
[0069]根據(jù)本申請的一個實(shí)施例,在接收到服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令的情況下,執(zhí)行所述分布式事務(wù)的回滾的步驟可以包括以下情形:
[0070](I)對于所述分布式事務(wù)中不可重試的事務(wù)分支,執(zhí)行所述事務(wù)分支的回滾。
[0071]對于不可重試的事務(wù)分支,在前述步驟中已經(jīng)真正的執(zhí)行,在接收到服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令的情況下,可以根據(jù)相應(yīng)的事務(wù)分支日志進(jìn)行該事務(wù)分支的回滾。
[0072](2)對于所述分布式事務(wù)中可以重試的事務(wù)分支,清除相應(yīng)的事務(wù)分支日志。
[0073]對于可以重試的事務(wù)分支,由于并沒有真正執(zhí)行,因此,在接收到服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令的情況下,可以清除相應(yīng)的事務(wù)分支日志。
[0074]在實(shí)際應(yīng)用中,本申請的分布式事務(wù)處理方法可以應(yīng)用于由客戶端發(fā)起的分布式事務(wù)中,例如,客戶端根據(jù)用戶進(jìn)行的操作開啟一個分布式事務(wù)(客戶端向服務(wù)器注冊全局事務(wù)),并處理該分布式事務(wù),服務(wù)器作為分布式事務(wù)的協(xié)調(diào)者,根據(jù)各個事務(wù)分支的執(zhí)行結(jié)果發(fā)起事務(wù)的全局提交或全局回滾,也就是說,向分布式事務(wù)的各個事務(wù)分支發(fā)送分支提交命令或分支回滾命令。
[0075]以下以一個具體實(shí)施例對本申請的分布式事務(wù)處理方法進(jìn)行詳細(xì)描述。
[0076]參考圖3,圖3是根據(jù)本申請一個實(shí)施例的分布式事務(wù)處理方法的流程圖。
[0077]步驟S310,開啟分布式事務(wù)。
[0078]由客戶端根據(jù)用戶進(jìn)行的操作,向服務(wù)器注冊全局事務(wù),服務(wù)器為該全局事務(wù)分配事務(wù)標(biāo)識ID。例如,用戶發(fā)起“賬戶A向賬戶B轉(zhuǎn)賬”,則向服務(wù)器注冊“賬戶A向賬戶B轉(zhuǎn)賬”的全局事務(wù)。
[0079]步驟S320,處理一個事務(wù)分支,判斷所處理的事務(wù)分支的執(zhí)行是否可以重試。
[0080]其中,如果所述事務(wù)分支的執(zhí)行可以重試,則執(zhí)行步驟S330;如果所述事務(wù)分支的執(zhí)行不可重試,則執(zhí)行步驟S340,需要說明的是,根據(jù)不同類型的分布式事務(wù)的執(zhí)行要求,各個事務(wù)分支的處理可以并行處理,或者以預(yù)定的順序進(jìn)行處理。
[0081]步驟S330,如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果,接下來進(jìn)行步驟S350。
[0082]步驟S340,如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果,接下來進(jìn)行步驟S350。
[0083]在對分布式事務(wù)的各個事務(wù)分支分別執(zhí)行上述步驟S320?S340直到完成對該分布式事務(wù)的所有事務(wù)分支的處理。
[0084]步驟S350,判斷是否存在未處理的事務(wù)分支。
[0085]如果存在未處理的事務(wù)分支,則返回步驟S320,繼續(xù)處理未處理的分支;如果不存在未處理的分支,則執(zhí)行步驟S360。
[0086]步驟S360,接收服務(wù)器返回的提交命令或者回滾命令,執(zhí)行分布式事務(wù)的提交或者回滾。
[0087]將所有事務(wù)分支的執(zhí)行結(jié)果向服務(wù)器上報后,服務(wù)器作為分布式事務(wù)的協(xié)調(diào)者,根據(jù)各個事務(wù)分支的執(zhí)行結(jié)果決定對該分布式事務(wù)發(fā)起全局提交或全局回滾。服務(wù)器可以向分布式事務(wù)的各個事務(wù)分支分別發(fā)送提交命令或回滾命令,接收到服務(wù)器返回的事務(wù)分支提交命令或事務(wù)分支回滾命令,執(zhí)行各個事務(wù)分支的提交或者回滾。
[0088]圖4是根據(jù)本申請一個實(shí)施例的對分布式事務(wù)的單個事務(wù)分支進(jìn)行提交的流程圖。如圖4所示,根據(jù)本申請的一個實(shí)施例,當(dāng)接收到服務(wù)器的提交命令時,假設(shè)該分支為可以重試的分支,則對單個分支進(jìn)行提交可以包括以下步驟:
[0089]步驟S410,接收到服務(wù)器發(fā)送的分支提交命令。
[0090]步驟S420,根據(jù)該事務(wù)分支創(chuàng)建一個子事務(wù)。
[0091]步驟S430,執(zhí)行所創(chuàng)建的子事務(wù),直到該子事務(wù)執(zhí)行成功。
[0092]步驟S440,提交所述事務(wù)分支。
[0093]步驟S450,向服務(wù)器上報所述分支提交成功的提交結(jié)果。
[0094]假設(shè)該分支為不可重試的分支,由于不可重試的分支已經(jīng)真正執(zhí)行,并且執(zhí)行成功,則在接收到服務(wù)器發(fā)送的分支提交命令后,可以直接提交所述事務(wù)分支,并向服務(wù)器上報所述分支提交成功的提交結(jié)果。也即是說,按照步驟S410—步驟S440—步驟S450的順序執(zhí)行。
[0095]根據(jù)上述實(shí)施例中的詳細(xì)描述,可見本申請在處理分布式事務(wù)時,對于可以重試的事務(wù)分支,不立即執(zhí)行,而是直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果,對于不可重試的事務(wù)分支,執(zhí)行后向服務(wù)器上報該分支的執(zhí)行結(jié)果,從而較快的進(jìn)入全局事務(wù)提交或回滾階段。在事務(wù)分支提交階段,執(zhí)行分布式事務(wù)中可以重試的事務(wù)分支,異步推進(jìn)分布式事務(wù)的提交,既保證了事務(wù)的成功率,又不影響事務(wù)的最終一致。
[0096]下面沿用步驟SllO中舉例,詳細(xì)說明本申請的方法的執(zhí)行。
[0097]用戶在客戶端發(fā)起“賬戶A向賬戶B轉(zhuǎn)賬”的操作,根據(jù)用戶進(jìn)行的操作向服務(wù)器注冊全局事務(wù);服務(wù)器會為該全局事務(wù)分配事務(wù)標(biāo)識ID?!百~戶A向賬戶B轉(zhuǎn)賬”需要在三個數(shù)據(jù)庫上進(jìn)行寫操作,也即是說,該事務(wù)可以分成三個事務(wù)分支:
[0098]1、在數(shù)據(jù)庫I上給賬戶A扣掉預(yù)定金額;
[0099]2、在數(shù)據(jù)庫2上給賬戶B加上相應(yīng)金額;
[0100]3、在數(shù)據(jù)庫3上進(jìn)行轉(zhuǎn)賬匯總。
[0101]其中,事務(wù)分支I和事務(wù)分支2要求必須立即成功,為不可重試的事務(wù)分支,而事務(wù)分支3只要求最終成功,為可以重試的事務(wù)分支。
[0102]處理事務(wù)分支1,該分支不可重試,因此,向服務(wù)器注冊事務(wù)分支I后執(zhí)行該分支,即,執(zhí)行在數(shù)據(jù)庫I上給賬戶A扣掉預(yù)定金額的操作,假設(shè)事務(wù)分支I執(zhí)行成功,則向服務(wù)器上報事務(wù)分支I執(zhí)行成功的執(zhí)行結(jié)果;
[0103]處理事務(wù)分支2,事務(wù)分支2的處理可以與事務(wù)分支I的處理并行進(jìn)行,由于事務(wù)分支2也是不可重試的分支,因此,向服務(wù)器注冊事務(wù)分支2并執(zhí)行該分支,即,執(zhí)行在數(shù)據(jù)庫2上給賬戶B加上相應(yīng)金額的操作,假設(shè)事務(wù)分支2也執(zhí)行成功,則向服務(wù)器上報事務(wù)分支2執(zhí)行成功的執(zhí)行結(jié)果;
[0104]處理事務(wù)分支3,事務(wù)分支3可以重試,因此在處理該分支時,向服務(wù)器注冊該分支后不立即執(zhí)行,而是直接向服務(wù)器上報該分支執(zhí)行成功的執(zhí)行結(jié)果。
[0105]各個事務(wù)分支處理完成后,服務(wù)器根據(jù)所有分支的執(zhí)行結(jié)果,確定對該分布式事務(wù)進(jìn)行提交或回滾,此時服務(wù)器接收到的所有分支的執(zhí)行結(jié)果都是成功,因此確定對該分布式事務(wù)進(jìn)行提交,則服務(wù)器返回對該分布式事務(wù)進(jìn)行提交的命令,即,向各個分支發(fā)送分支提交命令,各個分支根據(jù)提交命令進(jìn)行分支提交。其中,事務(wù)分支I和事務(wù)分支2已經(jīng)成功,可以直接提交,事務(wù)分支3為可以重試的分支,因此,創(chuàng)建根據(jù)該分支創(chuàng)建該分布式事務(wù)的一個子事務(wù),即創(chuàng)建“在數(shù)據(jù)庫3上進(jìn)行轉(zhuǎn)賬匯總”的子事務(wù),并執(zhí)行該子事務(wù)。執(zhí)行該子事務(wù)時,如果執(zhí)行不成功可以由服務(wù)器發(fā)起異步重試,直到執(zhí)行成功后進(jìn)行提交。
[0106]通過以上的實(shí)例可以看出,本申請通過將事務(wù)分支I和2配置為不可重試級別,將事務(wù)分支3配置為可以重試級別,在處理各個分支時,只對要求立即成功的事務(wù)分支1、2真正地執(zhí)行,對不要求立即成功的事務(wù)分支3不立即執(zhí)行,而是直接上報執(zhí)行成功的結(jié)果,使分布式事務(wù)的處理提前進(jìn)入提交階段,并且,將事務(wù)分支3創(chuàng)建為該分布式事務(wù)的一個子事務(wù),使事務(wù)分支3既可以異步重試,又與事務(wù)分支1、2保持在一個分布式事務(wù)中,保證了事務(wù)分支3與事務(wù)分支1、2的最終一致性。
[0107]本申請還提供了一種分布式事務(wù)的處理裝置。
[0108]圖5示意性地示出了根據(jù)本申請一個實(shí)施例的分布式事務(wù)的處理裝置的結(jié)構(gòu)框圖。
[0109]根據(jù)本申請的一個實(shí)施例,該分布式事務(wù)處理裝置500包括:判斷模塊510、處理模塊520以及執(zhí)行模塊530。
[0110]判斷模塊510,用于判斷所述分布式事務(wù)各個事務(wù)分支的執(zhí)行是否可以重試。
[0111]處理模塊520,用于根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理。
[0112]執(zhí)行模塊530,用于當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或回滾。
[0113]根據(jù)本申請的一個實(shí)施例,所述處理模塊520可以進(jìn)一步用于:如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果;如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果。
[0114]根據(jù)本申請的一個實(shí)施例,所述執(zhí)行模塊530可以包括:提交模塊,用于根據(jù)接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的提交;或者回滾模塊,用于根據(jù)接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的回滾。
[0115]根據(jù)本申請的一個實(shí)施例,所述提交模塊,包括:第一提交子模塊,用于對于所述分布式事務(wù)中可以重試的事務(wù)分支,根據(jù)所述事務(wù)分支創(chuàng)建子事務(wù),并執(zhí)行所創(chuàng)建的子事務(wù),當(dāng)所述子事務(wù)執(zhí)行成功時,提交所述子事務(wù);第二提交子模塊,用于對于所述分布式事務(wù)中不可重試的事務(wù)分支,提交所述事務(wù)分支,并清理相應(yīng)的事務(wù)分支日志。
[0116]根據(jù)本申請的一個實(shí)施例,所述第一提交子模塊可以進(jìn)一步用于:如果所述子事務(wù)執(zhí)行失敗,則對所述子事務(wù)進(jìn)行重試,直到所述子事務(wù)執(zhí)行成功。
[0117]根據(jù)本申請的一個實(shí)施例,該裝置500還可以包括:上報模塊,用于向服務(wù)器上報各個事務(wù)分支的提交結(jié)果。
[0118]根據(jù)本申請的一個實(shí)施例,所述回滾模塊包括:第一回滾子模塊,用于對于所述分布式事務(wù)中不可重試的事務(wù)分支,執(zhí)行所述事務(wù)分支的回滾;第二回滾子模塊,用于對于所述分布式事務(wù)中可以重試的事務(wù)分支,清除相應(yīng)的事務(wù)分支日志。
[0119]由于本實(shí)施例的裝置所實(shí)現(xiàn)的功能基本相應(yīng)于前述圖1至圖4所示的方法實(shí)施例,故本實(shí)施例的描述中未詳盡之處,可以參見前述實(shí)施例中的相關(guān)說明,在此不做贅述。
[0120]以上所述僅為本申請的實(shí)施例而已,并不用于限制本申請,對于本領(lǐng)域的技術(shù)人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請的權(quán)利要求范圍之內(nèi)。
【主權(quán)項】
1.一種分布式事務(wù)處理方法,其特征在于,包括: 判斷所述分布式事務(wù)各個事務(wù)分支的執(zhí)行是否可以重試,并根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理; 當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或回滾。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理,包括: 如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果; 如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果。3.根據(jù)權(quán)利要求2所述的方法,其特征在于,執(zhí)行所述分布式事務(wù)的提交或回滾,包括: 根據(jù)接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的提交; 或者 根據(jù)接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的回滾。4.根據(jù)權(quán)利要求3所述的方法,其特征在于,執(zhí)行所述分布式事務(wù)的提交,包括: 對于所述分布式事務(wù)中可以重試的事務(wù)分支,根據(jù)所述事務(wù)分支創(chuàng)建子事務(wù),并執(zhí)行所創(chuàng)建的子事務(wù),當(dāng)所述子事務(wù)執(zhí)行成功時,提交所述子事務(wù); 對于所述分布式事務(wù)中不可重試的事務(wù)分支,提交所述事務(wù)分支,并清理相應(yīng)的事務(wù)分支日志。5.根據(jù)權(quán)利要求4所述的方法,其特征在于,執(zhí)行所創(chuàng)建的子事務(wù),包括: 如果所述子事務(wù)執(zhí)行失敗,則對所述子事務(wù)進(jìn)行重試,直到所述子事務(wù)執(zhí)行成功。6.根據(jù)權(quán)利要求4所述方法,其特征在于,還包括:向服務(wù)器上報各個事務(wù)分支的提交結(jié)果。7.根據(jù)權(quán)利要求3所述的方法,其特征在于,執(zhí)行所述分布式事務(wù)的回滾,包括: 對于所述分布式事務(wù)中不可重試的事務(wù)分支,執(zhí)行所述事務(wù)分支的回滾; 對于所述分布式事務(wù)中可以重試的事務(wù)分支,清除相應(yīng)的事務(wù)分支日志。8.一種分布式事務(wù)處理裝置,其特征在于,包括: 判斷模塊,用于判斷所述分布式事務(wù)各個事務(wù)分支的執(zhí)行是否可以重試; 處理模塊,用于根據(jù)判斷的結(jié)果對每個事務(wù)分支進(jìn)行處理; 執(zhí)行模塊,用于當(dāng)所述分布式事務(wù)的所有事務(wù)分支處理完成后,執(zhí)行所述分布式事務(wù)的提交或回滾。9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述處理模塊,進(jìn)一步用于: 如果所述事務(wù)分支的執(zhí)行可以重試,則向服務(wù)器注冊所述事務(wù)分支,并向服務(wù)器上報所述事務(wù)分支執(zhí)行成功的執(zhí)行結(jié)果; 如果所述事務(wù)分支的執(zhí)行不可重試,則向服務(wù)器注冊所述事務(wù)分支,并執(zhí)行所述事務(wù)分支,向服務(wù)器上報所述事務(wù)分支的執(zhí)行結(jié)果。10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述執(zhí)行模塊,包括: 提交模塊,用于根據(jù)接收到的服務(wù)器發(fā)送的提交所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的提交; 或者 回滾模塊,用于根據(jù)接收到的服務(wù)器發(fā)送的回滾所述分布式事務(wù)的命令,執(zhí)行所述分布式事務(wù)的回滾。11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述提交模塊,包括: 第一提交子模塊,用于對于所述分布式事務(wù)中可以重試的事務(wù)分支,根據(jù)所述事務(wù)分支創(chuàng)建子事務(wù),并執(zhí)行所創(chuàng)建的子事務(wù),當(dāng)所述子事務(wù)執(zhí)行成功時,提交所述子事務(wù); 第二提交子模塊,用于對于所述分布式事務(wù)中不可重試的事務(wù)分支,提交所述事務(wù)分支,并清理相應(yīng)的事務(wù)分支日志。12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述第一提交子模塊,進(jìn)一步用于:如果所述子事務(wù)執(zhí)行失敗,則對所述子事務(wù)進(jìn)行重試,直到所述子事務(wù)執(zhí)行成功。13.根據(jù)權(quán)利要求11所述裝置,其特征在于,還包括: 上報模塊,用于向服務(wù)器上報各個事務(wù)分支的提交結(jié)果。14.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述回滾模塊,包括: 第一回滾子模塊,用于對于所述分布式事務(wù)中不可重試的事務(wù)分支,執(zhí)行所述事務(wù)分支的回滾; 第二回滾子模塊,用于對于所述分布式事務(wù)中可以重試的事務(wù)分支,清除相應(yīng)的事務(wù)分支日志。
【文檔編號】G06F17/30GK105988862SQ201510059686
【公開日】2016年10月5日
【申請日】2015年2月4日
【發(fā)明人】姜宇
【申請人】阿里巴巴集團(tuán)控股有限公司