本發(fā)明涉及計算機領(lǐng)域,特別是一種分布式管理方法;本發(fā)明還涉及一種用于實現(xiàn)所述方法的分布式管理系統(tǒng)。
背景技術(shù):
在當(dāng)今流行的分布式系統(tǒng)、微服務(wù)架構(gòu)的系統(tǒng)中,一個請求通常不是由一個服務(wù)中的一個方法單獨完成,而是由多個系統(tǒng)、多個服務(wù)、操作多個數(shù)據(jù)庫共同完成一個功能。
這樣的一個請求,涉及到多個子服務(wù)系統(tǒng)之間的接口調(diào)用,不同服務(wù)中對不同的數(shù)據(jù)庫操作是在不同的事務(wù)之中。如果所有流程正常正確地完成,則不會有異常,但如果某一個子系統(tǒng)子服務(wù)出現(xiàn)錯誤拋出異常的時候,它之前已經(jīng)完成的服務(wù)和之后還未進行的服務(wù)怎么處理,以及如何保證有服務(wù)拋出異常時,數(shù)據(jù)庫的一致性,是一個急需解決的問題。
針對上述問題,公開號為CN103902560A的發(fā)明專利公開了一種分布式事務(wù)處理方法及系統(tǒng)。所述方法包括:分布式事務(wù)管理器創(chuàng)建分布式全局事務(wù);業(yè)務(wù)數(shù)據(jù)管理器根據(jù)所述分布式全局事務(wù)創(chuàng)建對應(yīng)的不少于一個的子事務(wù);業(yè)務(wù)處理單元將所述分布式全局事務(wù)和所述子事務(wù)進行關(guān)聯(lián);分布式事務(wù)管理器發(fā)起所述分布式全局事務(wù)的提交或回滾操作。其中,當(dāng)全局事務(wù)與子事務(wù)無法建立關(guān)聯(lián)時,判斷為異常情況,并將該具備事務(wù)進行回滾操作。
然而,由于在一個分布式事務(wù)系統(tǒng)中事務(wù)復(fù)雜,可能出現(xiàn)的情況較多。現(xiàn)有技術(shù)僅僅以全局事務(wù)與子事務(wù)無法建立關(guān)聯(lián)作為異常情況,而且處理的方式單一,直接進行回滾操作。這樣這無法針對具體事務(wù)做出最合理的處理,影響了事務(wù)處理的效率。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的缺點與不足,提供了一種分布式事務(wù)管理方法及系統(tǒng)。
本發(fā)明具體通過以下的技術(shù)方案實現(xiàn):一種分布式事務(wù)管理方法,包括以下步驟:
定義全局事務(wù),并將該全局事務(wù)中調(diào)用的其他事務(wù)定義為子事務(wù);
建立全局事務(wù)表,用于記錄全局事務(wù)和子事務(wù)的狀態(tài);當(dāng)調(diào)用全局事務(wù)時,在該全局事務(wù)表中進行記錄;當(dāng)調(diào)用該全局事務(wù)中的子事務(wù)時,在該全局事務(wù)表中生成的子事務(wù)記錄;
定義一個全局事務(wù)管理器,用于掃描全局事務(wù)表,并進行判斷:
若全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程,將成功子事務(wù)進行回滾;
若全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程,則再次調(diào)用該子事務(wù);
若全局事務(wù)狀態(tài)為未知,則將成功的子事務(wù)進行回滾。
作為本發(fā)明的進一步改進,還包括步驟:在調(diào)用子事務(wù)時,將該子事務(wù)的調(diào)用參數(shù)和結(jié)果進行保存。
作為本發(fā)明的進一步改進,還包括步驟:在重復(fù)調(diào)用子事務(wù)時,保存重復(fù)調(diào)用的次數(shù)和時間。
作為本發(fā)明的進一步改進,還包括步驟:當(dāng)相同請求的子事務(wù)被重復(fù)調(diào)用時,跳過該重復(fù)請求。
作為本發(fā)明的進一步改進,當(dāng)全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程時,將該失敗的子事務(wù)進行升序排序,再逐一執(zhí)行調(diào)用操作。
作為本發(fā)明的進一步改進,當(dāng)全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程時,對成功的子事務(wù)進行降序排序,再逐一進行回滾操作。
作為本發(fā)明的進一步改進,當(dāng)同一個全局事務(wù)的子事務(wù)向前或回滾操作時,進行數(shù)據(jù)庫的行鎖操作。
作為本發(fā)明的進一步改進,當(dāng)有部分向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“部分已回滾”。
作為本發(fā)明的進一步改進,當(dāng)有全部向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“已回滾”。
本發(fā)明還涉及一種分布式事務(wù)的管理系統(tǒng),包括:
定義模塊,用于定義全局事務(wù),并將該全局事務(wù)中調(diào)用的其他事務(wù)定義為子事務(wù);
全局事務(wù)表建立模塊,用于建立全局事務(wù)表,所述全局事務(wù)表用于記錄全局事務(wù)和子事務(wù)的狀態(tài);當(dāng)調(diào)用全局事務(wù)時,在該全局事務(wù)表中進行記錄;當(dāng)調(diào)用該全局事務(wù)中的子事務(wù)時,在該全局事務(wù)表中生成的子事務(wù)記錄;
全局事務(wù)管理器,用于掃描全局事務(wù)表,并進行判斷:
若全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程,將成功子事務(wù)進行回滾;
若全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程,則再次調(diào)用該子事務(wù);
若全局事務(wù)狀態(tài)為未知,則將成功的子事務(wù)進行回滾。
作為本發(fā)明的進一步改進,還包括保存模塊,用于在調(diào)用子事務(wù)時,將該子事務(wù)的調(diào)用參數(shù)和結(jié)果進行保存。
作為本發(fā)明的進一步改進,所述保存模塊,還用于在重復(fù)調(diào)用子事務(wù)時,保存重復(fù)調(diào)用的次數(shù)和時間。
作為本發(fā)明的進一步改進,還包括請求判斷模塊,用于當(dāng)判斷為相同請求的子事務(wù)被重復(fù)調(diào)用時,跳過該重復(fù)請求。
作為本發(fā)明的進一步改進,還包括升序排序模塊,用于當(dāng)全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程時,將該失敗的子事務(wù)進行升序排序。
作為本發(fā)明的進一步改進,還包括降序排序模塊,用于當(dāng)全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程時,對成功的子事務(wù)進行降序排序。
作為本發(fā)明的進一步改進,還包括行鎖模塊,用于當(dāng)同一個全局事務(wù)的子事務(wù)向前或回滾操作時,進行數(shù)據(jù)庫的行鎖操作。
作為本發(fā)明的進一步改進,還包括狀態(tài)更新模塊,用于當(dāng)有部分向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“部分已回滾”。
作為本發(fā)明的進一步改進,還包括狀態(tài)更新模塊,用于當(dāng)有全部向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“已回滾”。
相比于現(xiàn)有技術(shù),本發(fā)明具備以下有益效果:
解決了在分布式系統(tǒng)、微服務(wù)架構(gòu)模式下,分布式事務(wù)難以統(tǒng)一管理,對其他服務(wù)調(diào)用結(jié)果無法控制的問題。在框架的全局事務(wù)管理功能的支持下,開發(fā)者和系統(tǒng)維護人員可以減少大量對錯誤數(shù)據(jù)的排查和維護,減少了對生產(chǎn)數(shù)據(jù)的人為操作,增強系統(tǒng)魯棒性,提高了數(shù)據(jù)正確性和可靠性,為多系統(tǒng)服務(wù)的復(fù)雜業(yè)務(wù)場景提供了簡潔的維護思路。同時,可以針對不同的業(yè)務(wù)進行對應(yīng)的處理,方式豐富,可以針對不同的業(yè)務(wù)情況執(zhí)行不同的處理方式。
為了更好地理解和實施,下面結(jié)合附圖詳細(xì)說明本發(fā)明。
附圖說明
圖1是本發(fā)明的分布式事務(wù)管理方法的步驟方法流程圖。
圖2是本發(fā)明的分布式事務(wù)管理系統(tǒng)的模塊連接框圖。
具體實施方式
本發(fā)明為了解決現(xiàn)有技術(shù)中對于異常情況處理方式單一的缺陷,提供了一種分布式事務(wù)的管理方法及系統(tǒng),具體通過以下的實施例進行說明。
請參閱圖1,其為本發(fā)明的分布式事務(wù)管理方法的步驟流程圖。本發(fā)明提供了一種分布式事務(wù)管理方法,包括以下步驟:
S1:定義全局事務(wù),并將該全局事務(wù)中調(diào)用的其他事務(wù)定義為子事務(wù)。
S2:建立全局事務(wù)表,用于記錄全局事務(wù)和子事務(wù)的狀態(tài);當(dāng)調(diào)用全局事務(wù)時,在該全局事務(wù)表中進行記錄;當(dāng)調(diào)用該全局事務(wù)中的子事務(wù)時,在該全局事務(wù)表中生成的子事務(wù)記錄。
具體的,在本步驟中,在調(diào)用一個全局事務(wù)過程時,將生成一個唯一的全局事務(wù)編號,并在全局事務(wù)表中插入一條記錄,代表這次調(diào)用。調(diào)用子事務(wù)時將生成對應(yīng)全局事務(wù)記錄的子事務(wù)記錄,子事務(wù)記錄包括自己的唯一編號,全局事務(wù)編號,以及它在全局事務(wù)過程中的序號。當(dāng)每個子事務(wù)在成功或者異常時,會在數(shù)據(jù)庫中更新該子事務(wù)的狀態(tài);當(dāng)全局事務(wù)完成或異常時,更新全局事務(wù)表中對應(yīng)記錄的狀態(tài)。
S3:定義一個全局事務(wù)管理器,用于掃描全局事務(wù)表,并進行以下的判斷。具體的,在本發(fā)明中全局事務(wù)管理器每30秒掃描該全局事務(wù)表。
S31:若全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程,則執(zhí)行步驟:對成功的子事務(wù)進行降序排序,再逐一進行回滾操作。具體的,在本發(fā)明中通過所述全局事務(wù)管理器自動調(diào)用該子事務(wù)的進行回滾,將已經(jīng)修改的數(shù)據(jù)還原。
S32:若全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程,則執(zhí)行步驟:將該失敗的子事務(wù)進行升序排序,再逐一執(zhí)行調(diào)用操作。具體的,在本發(fā)明中通過全局事務(wù)管理器再次調(diào)用該子事務(wù)方法,確保數(shù)據(jù)正常更新。
S33:若全局事務(wù)狀態(tài)為未知,則將成功的子事務(wù)進行回滾。
進一步,在本發(fā)明中為了讓全局事務(wù)管理器能夠自動調(diào)用子事務(wù)前進或回滾,全局事務(wù)表需要維護該子事務(wù)過程被調(diào)用時的請求參數(shù),或者使用其他方式傳遞參數(shù)。當(dāng)同一個全局事務(wù)的子事務(wù)向前或回滾操作時,進行數(shù)據(jù)庫的行鎖操作,避免并發(fā)。
其中,對于當(dāng)前向前或回滾失敗的事務(wù)過程,需要更新下次開始時間避免過于頻繁。比如:默認(rèn)遞增30秒,后期可考慮第一次失敗遞增30秒,第二次遞增60秒,第三次遞增1分鐘,最大遞增15分鐘等。
S4:在調(diào)用子事務(wù)時,將該子事務(wù)的調(diào)用參數(shù)和結(jié)果進行保存。
S5:在重復(fù)調(diào)用子事務(wù)時,保存重復(fù)調(diào)用的次數(shù)和時間。
S6:當(dāng)相同請求的子事務(wù)被重復(fù)調(diào)用時,跳過該重復(fù)請求。本步驟是為了維護數(shù)據(jù)一致性,避免重復(fù)調(diào)用導(dǎo)致更多的異常,子事務(wù)需要保證冪等性。
S7:全局事務(wù)狀態(tài)更新。當(dāng)有部分向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“部分已回滾”。當(dāng)有全部向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“已回滾”。
請參閱圖2,其為本發(fā)明的分布式事務(wù)管理系統(tǒng)的模塊連接框圖。另外,本發(fā)明還涉及一種分布式事務(wù)的管理系統(tǒng),包括:定義模塊1、全局事務(wù)表建立模塊2、全局事務(wù)管理器3、保存模塊4、請求判斷模塊5、升序排序模塊6、降序排序模塊7、行鎖模塊8和狀態(tài)更新模塊9。
所述定義模塊1,用于定義全局事務(wù),并將該全局事務(wù)中調(diào)用的其他事務(wù)定義為子事務(wù);
所述全局事務(wù)表建立模塊2,用于建立全局事務(wù)表,所述全局事務(wù)表用于記錄全局事務(wù)和子事務(wù)的狀態(tài);當(dāng)調(diào)用全局事務(wù)時,在該全局事務(wù)表中進行記錄;當(dāng)調(diào)用該全局事務(wù)中的子事務(wù)時,在該全局事務(wù)表中生成的子事務(wù)記錄;
所述全局事務(wù)管理器3,用于掃描全局事務(wù)表,并進行判斷:
若全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程,將成功子事務(wù)進行回滾;
若全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程,則再次調(diào)用該子事務(wù);
若全局事務(wù)狀態(tài)為未知,則將成功的子事務(wù)進行回滾。
所述保存模塊4,用于在調(diào)用子事務(wù)時,將該子事務(wù)的調(diào)用參數(shù)和結(jié)果進行保存。所述保存模塊,還用于在重復(fù)調(diào)用子事務(wù)時,保存重復(fù)調(diào)用的次數(shù)和時間。
所述請求判斷模塊5,用于當(dāng)判斷為相同請求的子事務(wù)被重復(fù)調(diào)用時,跳過該重復(fù)請求。
所述升序排序模塊6,用于當(dāng)全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程時,將該失敗的子事務(wù)進行升序排序。
所述降序排序模塊7,用于當(dāng)全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程時,對成功的子事務(wù)進行降序排序。
所述行鎖模塊8,用于當(dāng)同一個全局事務(wù)的子事務(wù)向前或回滾操作時,進行數(shù)據(jù)庫的行鎖操作。
所述狀態(tài)更新模塊9,用于當(dāng)有部分向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“部分已回滾”。所述狀態(tài)更新模塊,還用于當(dāng)有全部向前或回滾成功的子事務(wù),則更新全局事務(wù)的狀態(tài)為“已回滾”。
以下通過具體的實例,介紹本發(fā)明的分布式事務(wù)管理方法及系統(tǒng)時如何應(yīng)用的。
例如:在一個很常見的電子商務(wù)系統(tǒng)中的一個出價過程中,可能會先調(diào)用優(yōu)惠券服務(wù),獲取用戶的可用優(yōu)惠券,然后調(diào)用資金賬戶服務(wù),凍結(jié)用戶的相應(yīng)保證金,之后,再調(diào)用緩存服務(wù),更新出價記錄。
如果前面的流程都正常進行,但更新出價記錄時出錯了,那么怎么對扣除優(yōu)惠券和凍結(jié)保證金服務(wù)進行回滾呢?在出價過程中,如果凍結(jié)保證金服務(wù)超時了,那怎么知道操作是否成功,從而確保操作必須回滾呢?如果我們想在優(yōu)惠券服務(wù)超時時不退出,而繼續(xù)下面的出價流程,那么怎么在后面自動維護優(yōu)惠券的數(shù)據(jù),自動扣減呢?
針對上述情況,處理方法為:
第一步,定義全局事務(wù)和子事務(wù)。其中,以出價過程為全局事務(wù),并包括子事務(wù)1:調(diào)用優(yōu)惠券、子事務(wù)2:調(diào)用資金賬戶、子事務(wù)3:凍結(jié)保證金、子事務(wù)4:調(diào)用緩存服務(wù),更新出價記錄。
第二步,建立全局事務(wù)表。具體的方式及代碼可以為:
其中,相關(guān)的業(yè)務(wù)表需要記錄transaction_id和transaction_sequence信息。
第三步、定義全局事務(wù)管理器,掃描該全局事務(wù)表中的全局事務(wù)和子事務(wù)的狀態(tài)信息。若全局事務(wù)狀態(tài)為失敗,而該全局事務(wù)下存在成功的子事務(wù)過程,則執(zhí)行步驟:對成功的子事務(wù)進行降序排序,再逐一進行回滾操作。具體的,在本發(fā)明中通過所述全局事務(wù)管理器自動調(diào)用該子事務(wù)的進行回滾,將已經(jīng)修改的數(shù)據(jù)還原。
若全局事務(wù)狀態(tài)為成功,而該全局事務(wù)下存在失敗的子事務(wù)過程,則執(zhí)行步驟:將該失敗的子事務(wù)進行升序排序,再逐一執(zhí)行調(diào)用操作。具體的,在本發(fā)明中通過全局事務(wù)管理器再次調(diào)用該子事務(wù)方法,確保數(shù)據(jù)正常更新。
若全局事務(wù)狀態(tài)為未知,則將成功的子事務(wù)進行回滾。
比如,可以根據(jù)實際情況定義不同的規(guī)則,比如包括以下情況:
實際情況中,可以根據(jù)子事務(wù)的重要性,選擇不同的分類。比如:若子事務(wù)1比較重要,可以將其定義為影響全局事務(wù)狀態(tài)的必要因素,即子事務(wù)1失敗,則全局事務(wù)必然失敗。
以上僅僅是本發(fā)明的一個應(yīng)用實例,本發(fā)明的分布式事務(wù)處理方法和系統(tǒng)還可以應(yīng)用在其他的業(yè)務(wù)實際中。
相比于現(xiàn)有技術(shù),本發(fā)明具備以下有益效果:
解決了在分布式系統(tǒng)、微服務(wù)架構(gòu)模式下,分布式事務(wù)難以統(tǒng)一管理,對其他服務(wù)調(diào)用結(jié)果無法控制的問題。在框架的全局事務(wù)管理功能的支持下,開發(fā)者和系統(tǒng)維護人員可以減少大量對錯誤數(shù)據(jù)的排查和維護,減少了對生產(chǎn)數(shù)據(jù)的人為操作,增強系統(tǒng)魯棒性,提高了數(shù)據(jù)正確性和可靠性,為多系統(tǒng)服務(wù)的復(fù)雜業(yè)務(wù)場景提供了簡潔的維護思路。同時,可以針對不同的業(yè)務(wù)進行對應(yīng)的處理,方式豐富,可以針對不同的業(yè)務(wù)情況執(zhí)行不同的處理方式。
本發(fā)明并不局限于上述實施方式,如果對本發(fā)明的各種改動或變形不脫離本發(fā)明的精神和范圍,倘若這些改動和變形屬于本發(fā)明的權(quán)利要求和等同技術(shù)范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變形。