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