本發(fā)明涉及計(jì)算機(jī)處理領(lǐng)域,特別是涉及一種分布式事務(wù)處理方法和系統(tǒng)。
背景技術(shù):
事務(wù)(Transaction)是由一組操作構(gòu)成的可靠、獨(dú)立的工作單元,在該工作單元中所有的操作要么都成功,要么都失敗。事務(wù)具備四個(gè)基本的特性:原子性、一致性、隔離性、持久性,也簡(jiǎn)稱為事務(wù)的ACID特性。在微服務(wù)時(shí)代,業(yè)務(wù)進(jìn)行大量的拆分后,隨之而來的就是分布式事務(wù)的數(shù)據(jù)一致性問題,特別是涉及到交易的不同系統(tǒng)之間的分布式事務(wù)。為了保證分布式事務(wù)的數(shù)據(jù)一致性,通過事務(wù)表來記錄各個(gè)事務(wù)或子事務(wù)的操作狀態(tài),傳統(tǒng)的事務(wù)表的管理是通過單獨(dú)的一個(gè)服務(wù)系統(tǒng)來統(tǒng)一管理各個(gè)事務(wù)的操作狀態(tài),這樣每個(gè)業(yè)務(wù)系統(tǒng)都需要和該服務(wù)系統(tǒng)建立網(wǎng)絡(luò)連接,不僅耗費(fèi)網(wǎng)絡(luò)流量,而且由于每個(gè)業(yè)務(wù)系統(tǒng)要和服務(wù)系統(tǒng)進(jìn)行交互,所有的操作記錄都記錄在同一事務(wù)表中,不僅加重了事務(wù)表的負(fù)擔(dān),且導(dǎo)致操作效率較低,并且,若服務(wù)系統(tǒng)出現(xiàn)故障,那么將會(huì)導(dǎo)致業(yè)務(wù)系統(tǒng)整個(gè)癱瘓,即存在單點(diǎn)故障。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要針對(duì)上述問題,提出一種能夠減少網(wǎng)絡(luò)流量且效率高的分布式事務(wù)處理方法和系統(tǒng)。
一種分布式事務(wù)處理方法,所述方法包括:主業(yè)務(wù)系統(tǒng)接收分布式事務(wù)的開啟請(qǐng)求,根據(jù)所述開啟請(qǐng)求為所述分布式事務(wù)分配一個(gè)事務(wù)標(biāo)識(shí),將所述事務(wù)標(biāo)識(shí)和對(duì)應(yīng)的開啟狀態(tài)記錄到主事務(wù)表中,所述主事務(wù)表存儲(chǔ)在主業(yè)務(wù)數(shù)據(jù)庫中;所述主業(yè)務(wù)系統(tǒng)將所述分布式事務(wù)分為多個(gè)子事務(wù),并分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行所述子事務(wù)的指令,所述指令中包括事務(wù)標(biāo)識(shí);所述從業(yè)務(wù)系統(tǒng)根據(jù)所述執(zhí)行子事務(wù)的指令在從業(yè)務(wù)前置表中進(jìn)行對(duì)應(yīng)的操作,若操作成功,則根據(jù)所述事務(wù)標(biāo)識(shí)生成一條標(biāo)識(shí)當(dāng)前子事務(wù)操作狀態(tài)的記錄插入到子事務(wù)表中,若操作失敗,則不記錄,其中,所述從業(yè)務(wù)前置表為從業(yè)務(wù)主表的復(fù)制表,所述從業(yè)務(wù)前置表和所述子事務(wù)表都存儲(chǔ)在對(duì)應(yīng)的從業(yè)務(wù)數(shù)據(jù)庫中;所述主業(yè)務(wù)系統(tǒng)獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)所述操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息;所述消息系統(tǒng)將所述確認(rèn)消息或取消消息發(fā)送給對(duì)應(yīng)的各個(gè)從業(yè)務(wù)系統(tǒng);若所述從業(yè)務(wù)系統(tǒng)接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中以完成對(duì)應(yīng)子事務(wù)的提交,若所述從業(yè)務(wù)系統(tǒng)接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾。
在其中一個(gè)實(shí)施例中,所述主業(yè)務(wù)系統(tǒng)獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)所述操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息的步驟包括:所述主業(yè)務(wù)系統(tǒng)獲取各個(gè)子事務(wù)的操作結(jié)果,若所有子事務(wù)全部操作成功,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為嘗試完成,然后向消息系統(tǒng)發(fā)送確認(rèn)消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)完成;若至少一個(gè)子事務(wù)操作失敗,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為回滾中,然后向消息系統(tǒng)發(fā)送取消消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由回滾中更新為回滾完成。
在其中一個(gè)實(shí)施例中,所述若所述從業(yè)務(wù)系統(tǒng)接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中以完成對(duì)應(yīng)子事務(wù)的提交,若所述從業(yè)務(wù)系統(tǒng)接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾的步驟包括:若所述從業(yè)務(wù)系統(tǒng)收到的消息為確認(rèn)消息,則根據(jù)所述確認(rèn)消息將所述子事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)中,然后根據(jù)所述子事務(wù)表中的操作記錄將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中,若同步成功,則將所述子事務(wù)表中的狀態(tài)更新為確認(rèn)完成;若所述從業(yè)務(wù)系統(tǒng)收到的消息為取消消息,則根據(jù)所述事務(wù)標(biāo)識(shí)在子事務(wù)表中查找與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的操作狀態(tài),若能夠查找到,則將所述操作狀態(tài)更新為回滾中,然后根據(jù)所述子事務(wù)表中的操作記錄將之前對(duì)所述從業(yè)務(wù)前置表的操作進(jìn)行回滾,若回滾成功,則將所述子事務(wù)表中的操作狀態(tài)更新為回滾完成,若查找不到,則結(jié)束。
在其中一個(gè)實(shí)施例中,所述主業(yè)務(wù)系統(tǒng)將所述分布式事務(wù)分為多個(gè)子事務(wù),并分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行所述子事務(wù)的指令,所述指令中包括事務(wù)標(biāo)識(shí)的步驟包括:所述主業(yè)務(wù)系統(tǒng)將所述分布式事務(wù)分為多個(gè)子事務(wù)并設(shè)置各個(gè)子事務(wù)的執(zhí)行順序,按照所述執(zhí)行順序向?qū)?yīng)的從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行所述子事務(wù)的指令,所述指令中包括事務(wù)標(biāo)識(shí),當(dāng)接收到前一個(gè)子事務(wù)執(zhí)行結(jié)果為成功時(shí),才將后一個(gè)子事務(wù)的執(zhí)行命令發(fā)送到對(duì)應(yīng)的從業(yè)務(wù)系統(tǒng),若接收到前一個(gè)子事務(wù)的執(zhí)行結(jié)果為失敗,則不再執(zhí)行后面的子事務(wù)。
在其中一個(gè)實(shí)施例中,所述方法還包括:在所述主業(yè)務(wù)系統(tǒng)和所述每個(gè)從業(yè)務(wù)系統(tǒng)中各設(shè)置一個(gè)檢查機(jī)制,所述檢查機(jī)制用于監(jiān)控主事務(wù)表或子事務(wù)表中事務(wù)的操作狀態(tài),若發(fā)現(xiàn)所述操作狀態(tài)異常,則根據(jù)所述事務(wù)表中的記錄向所述消息系統(tǒng)再次發(fā)送確認(rèn)消息或取消消息以更改所述操作狀態(tài)。
一種分布式事務(wù)處理系統(tǒng),所述系統(tǒng)包括:主業(yè)務(wù)系統(tǒng),用于接收分布式事務(wù)的開啟請(qǐng)求,根據(jù)所述開啟請(qǐng)求為所述分布式事務(wù)分配一個(gè)事務(wù)標(biāo)識(shí),將所述事務(wù)標(biāo)識(shí)和對(duì)應(yīng)的開啟狀態(tài)記錄到主事務(wù)表中,所述主事務(wù)表存儲(chǔ)在主業(yè)務(wù)數(shù)據(jù)庫中,并將所述分布式事務(wù)分為多個(gè)子事務(wù),分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行所述子事務(wù)的指令,所述指令中包括事務(wù)標(biāo)識(shí);從業(yè)務(wù)系統(tǒng),所述從業(yè)務(wù)系統(tǒng)有多個(gè),用于根據(jù)所述執(zhí)行子事務(wù)的指令在從業(yè)務(wù)前置表中進(jìn)行對(duì)應(yīng)的操作,若操作成功,則根據(jù)所述事務(wù)標(biāo)識(shí)生成一條標(biāo)識(shí)當(dāng)前子事務(wù)操作狀態(tài)的記錄插入到子事務(wù)表中,若操作失敗,則不記錄,其中,所述從業(yè)務(wù)前置表為從業(yè)務(wù)主表的復(fù)制表,所述從業(yè)務(wù)前置表和所述子事務(wù)表都存儲(chǔ)在對(duì)應(yīng)的從業(yè)務(wù)數(shù)據(jù)庫中;所述主業(yè)務(wù)系統(tǒng)還用于獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)所述操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息;消息系統(tǒng),用于將所述確認(rèn)消息或取消消息發(fā)送給對(duì)應(yīng)的各個(gè)從業(yè)務(wù)系統(tǒng);所述從業(yè)務(wù)系統(tǒng)還用于若接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中以完成對(duì)應(yīng)子事務(wù)的提交,若接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾。
在其中一個(gè)實(shí)施例中,所述主業(yè)務(wù)系統(tǒng)還用于獲取各個(gè)子事務(wù)的操作結(jié)果,若所有子事務(wù)全部操作成功,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為嘗試完成,然后向消息系統(tǒng)發(fā)送確認(rèn)消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)完成;若至少一個(gè)子事務(wù)操作失敗,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為回滾中,然后向消息系統(tǒng)發(fā)送取消消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由回滾中更新為回滾完成。
在其中一個(gè)實(shí)施例中,所述從業(yè)務(wù)系統(tǒng)還用于若收到的消息為確認(rèn)消息,則根據(jù)所述確認(rèn)消息將所述子事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)中,然后根據(jù)所述子事務(wù)表中的操作記錄將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中,若同步成功,則將所述子事務(wù)表中的狀態(tài)更新為確認(rèn)完成;若收到的消息為取消消息,則根據(jù)所述事務(wù)標(biāo)識(shí)在子事務(wù)表中查找與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的操作狀態(tài),若能夠查找到,則將所述操作狀態(tài)更新為回滾中,然后根據(jù)所述子事務(wù)表中的操作記錄將之前對(duì)所述從業(yè)務(wù)前置表的操作進(jìn)行回滾,若回滾成功,則將所述子事務(wù)表中的操作狀態(tài)更新為回滾完成,若查找不到,則結(jié)束。
在其中一個(gè)實(shí)施例中,所述主業(yè)務(wù)系統(tǒng)將所述分布式事務(wù)分為多個(gè)子事務(wù)并設(shè)置各個(gè)子事務(wù)的執(zhí)行順序,按照所述執(zhí)行順序向?qū)?yīng)的從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行所述子事務(wù)的指令,所述指令中包括事務(wù)標(biāo)識(shí),當(dāng)接收到前一個(gè)子事務(wù)執(zhí)行結(jié)果為成功時(shí),才將后一個(gè)子事務(wù)的執(zhí)行命令發(fā)送到對(duì)應(yīng)的從業(yè)務(wù)系統(tǒng),若接收到前一個(gè)子事務(wù)的執(zhí)行結(jié)果為失敗,則不再執(zhí)行后面的子事務(wù)。
在其中一個(gè)實(shí)施例中,所述主業(yè)務(wù)系統(tǒng)和所述各個(gè)從業(yè)務(wù)系統(tǒng)還用于通過設(shè)置的檢查機(jī)制監(jiān)控主事務(wù)表或子事務(wù)表中事務(wù)的操作狀態(tài),若發(fā)現(xiàn)所述操作狀態(tài)異常,則根據(jù)所述事務(wù)表中的記錄向所述消息系統(tǒng)再次發(fā)送確認(rèn)消息或取消消息以更改所述操作狀態(tài)。
上述分布式事務(wù)處理方法和系統(tǒng),通過在每個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫中添加一個(gè)事務(wù)表(為了區(qū)分,主業(yè)務(wù)數(shù)據(jù)庫中的事務(wù)表稱為主事務(wù)表,從業(yè)務(wù)數(shù)據(jù)庫中的事務(wù)表稱為子事務(wù)表),即事務(wù)表是以分布式方式存在于每個(gè)業(yè)務(wù)系統(tǒng)的本地?cái)?shù)據(jù)庫中,從而可以簡(jiǎn)單有效的保證每個(gè)事務(wù)或子事務(wù)的ACID性,且由于不再需要單獨(dú)一個(gè)服務(wù)系統(tǒng)來統(tǒng)一管理事務(wù)表,所以各個(gè)業(yè)務(wù)系統(tǒng)也就不需要再與服務(wù)系統(tǒng)建立網(wǎng)格連接,且也不需要再通過與服務(wù)系統(tǒng)進(jìn)行交互來操作事務(wù)表,從而不但可以減少網(wǎng)絡(luò)流量的消耗,而且可以提高處理事務(wù)的效率,進(jìn)一步的,由于該事務(wù)表是以分布式方式存在的,所以避免了單點(diǎn)故障,具有一定的容錯(cuò)性,且通過將事務(wù)表的記錄進(jìn)行分散,大大減少了單個(gè)事務(wù)表的讀寫負(fù)擔(dān)。
附圖說明
圖1為一個(gè)實(shí)施例中分布式事務(wù)處理方法的應(yīng)用環(huán)境圖;
圖2為一個(gè)實(shí)施例中服務(wù)器的內(nèi)部結(jié)構(gòu)框圖;
圖3為一個(gè)實(shí)施例中分布式事務(wù)處理方法的流程圖;
圖4為另一個(gè)實(shí)施例中分布式事務(wù)處理方法的應(yīng)用環(huán)境圖;
圖5為一個(gè)實(shí)施例中分布式事務(wù)處理系統(tǒng)的架構(gòu)圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,在一個(gè)實(shí)施例中,提出了一種分布式事務(wù)處理方法,該方法可應(yīng)用于如圖1所示的應(yīng)用環(huán)境中,在該應(yīng)用環(huán)境中,第一服務(wù)器102分別與多個(gè)第二服務(wù)器104連接,同時(shí),第一服務(wù)器102與第三服務(wù)器106連接,第二服務(wù)器104也與第三服務(wù)器106建立連接。其中,第一服務(wù)器102運(yùn)行一個(gè)主業(yè)務(wù)系統(tǒng),每個(gè)第二服務(wù)器104運(yùn)行一個(gè)從業(yè)務(wù)系統(tǒng),第三服務(wù)器106運(yùn)行一個(gè)消息系統(tǒng)。具體的,運(yùn)行主業(yè)務(wù)系統(tǒng)的第一服務(wù)器102用于接收分布式事務(wù)的開啟請(qǐng)求,根據(jù)所述開啟請(qǐng)求為所述分布式事務(wù)分配一個(gè)事務(wù)標(biāo)識(shí),將所述事務(wù)標(biāo)識(shí)和對(duì)應(yīng)的開啟狀態(tài)記錄到主事務(wù)表中,所述主事務(wù)表存儲(chǔ)在主業(yè)務(wù)數(shù)據(jù)庫中,且將所述分布式事務(wù)分為多個(gè)子事務(wù),并分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行所述子事務(wù)的指令,所述指令中包括事務(wù)標(biāo)識(shí);運(yùn)行從業(yè)務(wù)系統(tǒng)的第二服務(wù)器104用于根據(jù)所述執(zhí)行子事務(wù)的指令在從業(yè)務(wù)前置表中進(jìn)行對(duì)應(yīng)的操作,若操作成功,則根據(jù)所述事務(wù)標(biāo)識(shí)生成一條標(biāo)識(shí)當(dāng)前子事務(wù)操作狀態(tài)的記錄插入到子事務(wù)表中,若操作失敗,則不記錄,其中,所述從業(yè)務(wù)前置表為從業(yè)務(wù)主表的復(fù)制表,所述從業(yè)務(wù)前置表和所述子事務(wù)表都存儲(chǔ)在對(duì)應(yīng)的從業(yè)務(wù)數(shù)據(jù)庫中;運(yùn)行主業(yè)務(wù)系統(tǒng)的第一服務(wù)器102還用于獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)所述操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息;運(yùn)行消息系統(tǒng)的第三服務(wù)器106用于將所述確認(rèn)消息或取消消息發(fā)送給對(duì)應(yīng)的各個(gè)從業(yè)務(wù)系統(tǒng);運(yùn)行從業(yè)務(wù)系統(tǒng)的第二服務(wù)器104還用于若接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中以完成對(duì)應(yīng)子事務(wù)的提交,若接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾。
如圖2所示,在一個(gè)實(shí)施例中,上述服務(wù)器102的內(nèi)部結(jié)構(gòu)示意圖如圖2所示,包括通過系統(tǒng)總線連接的處理器、非易失性存儲(chǔ)介質(zhì)、內(nèi)存和網(wǎng)絡(luò)接口。其中,該非易失存儲(chǔ)介質(zhì)包括操作系統(tǒng)、數(shù)據(jù)庫、分布式事務(wù)處理裝置。數(shù)據(jù)庫用于存儲(chǔ)數(shù)據(jù),比如,存儲(chǔ)事務(wù)表。該任務(wù)分配的裝置用于實(shí)現(xiàn)一種分布式事務(wù)處理方法,該服務(wù)器的處理器用于提供計(jì)算和控制能力,支撐整個(gè)服務(wù)器的運(yùn)行。該服務(wù)器的網(wǎng)絡(luò)接口用于與外部的服務(wù)器和終端通過網(wǎng)絡(luò)連接通信,比如,接收分布式事務(wù)的開啟請(qǐng)求等。本領(lǐng)域技術(shù)人員可以理解,圖2中示出的結(jié)構(gòu),僅僅是與本申請(qǐng)方案相關(guān)的部分結(jié)構(gòu)的框圖,并不構(gòu)成對(duì)本申請(qǐng)方案所應(yīng)用于其上的服務(wù)器的限定,具體的服務(wù)器可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
如圖3所示,在一個(gè)實(shí)施例中,提出了一種分布式事務(wù)處理方法,該方法包括:
步驟302,主業(yè)務(wù)系統(tǒng)接收分布式事務(wù)的開啟請(qǐng)求,根據(jù)開啟請(qǐng)求為分布式事務(wù)分配一個(gè)事務(wù)標(biāo)識(shí),將事務(wù)標(biāo)識(shí)和對(duì)應(yīng)的開啟狀態(tài)記錄到主事務(wù)表中,主事務(wù)表存儲(chǔ)在主業(yè)務(wù)數(shù)據(jù)庫中。
在本實(shí)施例中,主業(yè)務(wù)系統(tǒng)是指直接接收事務(wù)的系統(tǒng),該主業(yè)務(wù)系統(tǒng)從事務(wù)入口處接收分布式事務(wù)的開啟請(qǐng)求,然后根據(jù)該開啟請(qǐng)求為分布式事務(wù)分配一個(gè)事務(wù)標(biāo)識(shí),其中,事務(wù)標(biāo)識(shí)用于唯一標(biāo)識(shí)一個(gè)分布式事務(wù),事務(wù)標(biāo)識(shí)可以是分配給分布式事務(wù)的唯一編號(hào),也可以是其他可以唯一代表該分布式事務(wù)的標(biāo)識(shí)。為了清楚的了解每個(gè)分布式事務(wù)的操作狀態(tài),需要將分布式事務(wù)的操作狀態(tài)記錄到主事務(wù)表中,也就是說,主事務(wù)表用于記錄每個(gè)分布式事務(wù)的當(dāng)前操作狀態(tài)。具體的,當(dāng)為分布式事務(wù)分配了一個(gè)事務(wù)標(biāo)識(shí)后,根據(jù)該事務(wù)標(biāo)識(shí)和對(duì)應(yīng)的開啟狀態(tài)生成一條記錄該分布式事務(wù)的開啟狀態(tài)的記錄插入到該主事務(wù)表中,主事務(wù)表存在在該主業(yè)務(wù)系統(tǒng)的本地?cái)?shù)據(jù)庫中,可以有效的保證事務(wù)的ACID性,即如果分布式事務(wù)開啟成功,那么必然會(huì)將該分布式事務(wù)的開啟狀態(tài)記錄到主事務(wù)表中,也就是說,兩者之間的操作具有原子性,要么全部執(zhí)行,要么全部不執(zhí)行。
步驟304,主業(yè)務(wù)系統(tǒng)將分布式事務(wù)分為多個(gè)子事務(wù),并分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,指令中包括事務(wù)標(biāo)識(shí)。
在本實(shí)施例中,主業(yè)務(wù)系統(tǒng)將分布式事務(wù)開啟之后,還需要按照預(yù)設(shè)的規(guī)則將分布式事務(wù)分為多個(gè)子事務(wù),然后分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,該指令中包括事務(wù)標(biāo)識(shí),便于從業(yè)務(wù)系統(tǒng)了解該子事務(wù)屬于哪個(gè)分布式事務(wù)。從業(yè)務(wù)系統(tǒng)是相對(duì)主業(yè)務(wù)系統(tǒng)而言的,用于執(zhí)行主業(yè)務(wù)系統(tǒng)分配的子事務(wù),一般從業(yè)務(wù)系統(tǒng)有多個(gè),主業(yè)務(wù)系統(tǒng)需要分別向各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行對(duì)應(yīng)子事務(wù)的指令。在一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)是通過并行的方式將各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行對(duì)應(yīng)子事務(wù)的指令,即主業(yè)務(wù)系統(tǒng)將劃分后的子事務(wù)同時(shí)分別發(fā)送給各個(gè)從業(yè)務(wù)系統(tǒng),各個(gè)從業(yè)務(wù)系統(tǒng)之間是并行執(zhí)行的方式。在另一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)是通過串行的方式將子事務(wù)發(fā)送給對(duì)應(yīng)的從業(yè)務(wù)系統(tǒng)進(jìn)行執(zhí)行,此時(shí)不但需要將分布式事務(wù)分為多個(gè)子事務(wù)還需要設(shè)置各個(gè)子事務(wù)的執(zhí)行順序,只有前一個(gè)子事務(wù)執(zhí)行成功,才會(huì)將后一個(gè)子事務(wù)的執(zhí)行命令發(fā)送到對(duì)應(yīng)的從業(yè)務(wù)系統(tǒng),若接收到前一個(gè)子事務(wù)的執(zhí)行結(jié)果為失敗,則不再執(zhí)行后面的子事務(wù)。舉一個(gè)例子,假設(shè)有商城系統(tǒng),庫存系統(tǒng)、訂單系統(tǒng)這三個(gè)業(yè)務(wù)系統(tǒng),其中,商城系統(tǒng)為主業(yè)務(wù)系統(tǒng),而庫存系統(tǒng)和訂單系統(tǒng)分別為從業(yè)務(wù)系統(tǒng);商城系統(tǒng)接收到用戶的購買請(qǐng)求后,首先需要進(jìn)行在庫存系統(tǒng)中進(jìn)行減庫存的操作,然后再在訂單系統(tǒng)中進(jìn)行新增訂單的操作,只有減庫存的操作成功,才會(huì)執(zhí)行新增訂單的操作,若減庫存的操作失敗,說明沒有庫存或庫存不足,不能滿足用戶的需求,也就不需要再進(jìn)行新增訂單的操作。
步驟306,從業(yè)務(wù)系統(tǒng)根據(jù)執(zhí)行子事務(wù)的指令在從業(yè)務(wù)前置表中進(jìn)行對(duì)應(yīng)的操作,若操作成功,則根據(jù)事務(wù)標(biāo)識(shí)生成一條標(biāo)識(shí)當(dāng)前子事務(wù)操作狀態(tài)的記錄插入到子事務(wù)表中,若操作失敗,則不記錄,其中,從業(yè)務(wù)前置表為從業(yè)務(wù)主表的復(fù)制表,從業(yè)務(wù)前置表和子事務(wù)表都存儲(chǔ)在對(duì)應(yīng)的從業(yè)務(wù)數(shù)據(jù)庫中。
在本實(shí)施例中,從業(yè)務(wù)系統(tǒng)接收到主業(yè)務(wù)系統(tǒng)發(fā)送的執(zhí)行子事務(wù)的指令后,根據(jù)該指令在從業(yè)務(wù)前置表中進(jìn)行對(duì)應(yīng)的操作,其中,從業(yè)務(wù)前置表是從業(yè)務(wù)主表的復(fù)制表。在整個(gè)分布式事務(wù)未執(zhí)行成功前,為了保證各個(gè)子事務(wù)的一致性,先是在從業(yè)務(wù)前置表中操作,保持從業(yè)務(wù)主表的數(shù)據(jù)不變,后續(xù)待所有子事務(wù)都執(zhí)行成功后,再同時(shí)執(zhí)行各個(gè)從業(yè)務(wù)主表,這樣可以有效的保證各個(gè)子事務(wù)的一致性,且由于是在前置表中進(jìn)行的操作,在分布式事務(wù)提交之前即分布式事務(wù)執(zhí)行成功之前,如果進(jìn)行讀操作,則讀取的是業(yè)務(wù)主表。具體的,若從業(yè)務(wù)系統(tǒng)操作從業(yè)務(wù)前置表成功后,則根據(jù)事務(wù)標(biāo)識(shí)生成一條標(biāo)識(shí)當(dāng)前子事務(wù)操作狀態(tài)的記錄插入到子事務(wù)表中,若操作失敗,則不記錄。由于從業(yè)務(wù)前置表和子事務(wù)表存在于同一數(shù)據(jù)庫中,所以可以有效保證事務(wù)的ACID性,即只要操作從業(yè)務(wù)前置表成功,則必然會(huì)在子事務(wù)表中插入一條標(biāo)記當(dāng)前操作狀態(tài)的記錄,同樣的,若操作失敗,則不會(huì)有任何記錄。
步驟308,主業(yè)務(wù)系統(tǒng)獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息。
在本實(shí)施例中,主業(yè)務(wù)系統(tǒng)獲取到各個(gè)子事務(wù)的操作結(jié)果后,根據(jù)該操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若全部操作成功,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為嘗試完成狀態(tài),然后向消息系統(tǒng)發(fā)送確認(rèn)消息;若至少一個(gè)子事務(wù)執(zhí)行失敗,則將主事務(wù)表中的開啟狀態(tài)更新為回滾中狀態(tài),然后向消息系統(tǒng)發(fā)送取消消息。具體的,通過主業(yè)務(wù)系統(tǒng)通過采用AOP切面技術(shù)來獲取到各個(gè)子事務(wù)的操作結(jié)果,即延伸了業(yè)務(wù)事務(wù)范圍操作事務(wù)表,不但保證了各個(gè)子事務(wù)之間的原子性,即要么全部成功,要么全部失敗,而且對(duì)業(yè)務(wù)代碼無侵入即不需要更改業(yè)務(wù)代碼。
步驟310,消息系統(tǒng)將確認(rèn)消息或取消消息發(fā)送給對(duì)應(yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)。
在本實(shí)施例中,消息系統(tǒng)接收到主業(yè)務(wù)系統(tǒng)發(fā)送的確認(rèn)消息或取消消息后,根據(jù)確認(rèn)消息或取消消息中的事務(wù)標(biāo)識(shí),將該確認(rèn)消息或取消消息發(fā)送到與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的各個(gè)從業(yè)務(wù)系統(tǒng),即發(fā)送到所有與該事務(wù)標(biāo)識(shí)有關(guān)的從業(yè)務(wù)系統(tǒng)。
步驟312,若從業(yè)務(wù)系統(tǒng)接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中以完成對(duì)應(yīng)子事務(wù)的提交,若從業(yè)務(wù)系統(tǒng)接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾。
在本實(shí)施例中,若從業(yè)務(wù)系統(tǒng)收到的消息為確認(rèn)消息,則根據(jù)確認(rèn)消息中的事務(wù)標(biāo)識(shí)在子事務(wù)表中找到對(duì)應(yīng)的操作記錄,將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中從而完成對(duì)應(yīng)子事務(wù)的提交;若從業(yè)務(wù)系統(tǒng)接收到的消息為取消消息,則通過回調(diào)直接將之前在從業(yè)務(wù)前置表中操作進(jìn)行回滾。具體的,若從業(yè)務(wù)系統(tǒng)收到的消息為確認(rèn)消息,首先根據(jù)該確認(rèn)消息將子事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)中,然后再根據(jù)子事務(wù)表中的操作記錄將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中,若同步成功,則將子事務(wù)表中的狀態(tài)由確認(rèn)中更新為確認(rèn)完成;若從業(yè)務(wù)系統(tǒng)收到的消息為取消消息,則根據(jù)事務(wù)標(biāo)識(shí)在子事務(wù)表中查找與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的操作狀態(tài),若能夠查找到,則將操作狀態(tài)由嘗試完成更新為回滾中,然后根據(jù)子事務(wù)表中的操作記錄將之前對(duì)業(yè)務(wù)前置表的操作進(jìn)行回滾,若回滾成功,則將子事務(wù)表中的操作狀態(tài)更新為回滾完成,若查不到,則結(jié)束,說明之前執(zhí)行失敗,沒有相關(guān)記錄所以不需要處理。
在本實(shí)施例中,通過在每個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫中添加一個(gè)事務(wù)表(為了區(qū)分,主業(yè)務(wù)數(shù)據(jù)庫中的事務(wù)表稱為主事務(wù)表,從業(yè)務(wù)數(shù)據(jù)庫中的事務(wù)表稱為子事務(wù)表),即事務(wù)表是以分布式方式存在于每個(gè)業(yè)務(wù)系統(tǒng)的本地?cái)?shù)據(jù)庫中,從而可以簡(jiǎn)單有效的保證每個(gè)事務(wù)或子事務(wù)的ACID性,且由于不再需要單獨(dú)一個(gè)服務(wù)系統(tǒng)來統(tǒng)一管理事務(wù)表,所以各個(gè)業(yè)務(wù)系統(tǒng)也就不需要再與服務(wù)系統(tǒng)建立網(wǎng)格連接,且也不需要再通過與服務(wù)系統(tǒng)進(jìn)行交互來操作事務(wù)表,從而不但可以減少網(wǎng)絡(luò)流量的消耗,而且可以提高處理事務(wù)的效率,進(jìn)一步的,由于該事務(wù)表是以分布式方式存在的,所以避免了單點(diǎn)故障,具有一定的容錯(cuò)性。且通過將事務(wù)表的記錄進(jìn)行分散,大大減少了單個(gè)事務(wù)表的讀寫負(fù)擔(dān)。
在一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息的步驟308包括:主業(yè)務(wù)系統(tǒng)獲取各個(gè)子事務(wù)的操作結(jié)果,若所有子事務(wù)全部操作成功,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為嘗試完成,然后向消息系統(tǒng)發(fā)送確認(rèn)消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)完成;若至少一個(gè)子事務(wù)操作失敗,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為回滾中,然后向消息系統(tǒng)發(fā)送取消消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由回滾中更新為回滾完成。
在本實(shí)施例中,主業(yè)務(wù)系統(tǒng)獲取到各個(gè)子事務(wù)的操作結(jié)果,若所有子事務(wù)全部操作成功,說明所有子事務(wù)都已經(jīng)做好了提交的準(zhǔn)備,此時(shí)將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為嘗試完成,然后向消息系統(tǒng)發(fā)送確認(rèn)消息,接收到消息系統(tǒng)返回的應(yīng)答時(shí),說明消息成功發(fā)送,此時(shí)主業(yè)務(wù)系統(tǒng)的工作已經(jīng)全部完成,所以將主事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)完成。若出現(xiàn)一個(gè)或多個(gè)子事務(wù)操作失敗,那么遵循事務(wù)的ACID性,代表該分布式事務(wù)執(zhí)行失敗,此時(shí)需要將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為回滾中,然后向消息系統(tǒng)發(fā)送取消消息,同樣地,若收到消息系統(tǒng)返回的應(yīng)答則說明消息已經(jīng)發(fā)送成功,然后將主事務(wù)表中的操作狀態(tài)由回滾中更新為回滾完成。
在一個(gè)實(shí)施例中,若從業(yè)務(wù)系統(tǒng)接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中完成對(duì)應(yīng)子事務(wù)的提交,若從業(yè)務(wù)系統(tǒng)接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾的步驟312包括:若從業(yè)務(wù)系統(tǒng)收到的消息為確認(rèn)消息,則根據(jù)確認(rèn)消息將子事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)中,然后根據(jù)子事務(wù)表中的操作記錄將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中,若同步成功,則將子事務(wù)表中的狀態(tài)更新為確認(rèn)完成;若從業(yè)務(wù)系統(tǒng)收到的消息為取消消息,則根據(jù)事務(wù)標(biāo)識(shí)在子事務(wù)表中查找與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的操作狀態(tài),若能夠查找到,則將操作狀態(tài)更新為回滾中,然后根據(jù)子事務(wù)表中的操作記錄將之前對(duì)從業(yè)務(wù)前置表的操作進(jìn)行回滾,若回滾成功,則將子事務(wù)表中的操作狀態(tài)更新為回滾完成,若查找不到,則結(jié)束。
在本實(shí)施例中,消息系統(tǒng)將確認(rèn)消息或取消消息發(fā)送給各個(gè)參與的從業(yè)務(wù)系統(tǒng),為了避免消息系統(tǒng)重復(fù)發(fā)送消息造成操作的重復(fù)執(zhí)行,從業(yè)務(wù)系統(tǒng)在接收到確認(rèn)消息或取消消息后,首先需要進(jìn)行消息去重,即判斷該消息是否為重復(fù)發(fā)送,具體的,可以采用消息應(yīng)用狀態(tài)表記錄每次消息的發(fā)送,接收到消息后,首先在該消息應(yīng)用狀態(tài)表中查找是否收到過同樣的消息,若是,則說明該消息為重復(fù)發(fā)送,丟棄即可,若沒有查找到,說明該消息是第一次發(fā)送,則保留。若從業(yè)務(wù)系統(tǒng)經(jīng)過消息去重收到的消息為確認(rèn)消息,則首先根據(jù)確認(rèn)消息中的事務(wù)標(biāo)識(shí)將子事務(wù)表中該事務(wù)的操作狀態(tài)由嘗試完成更新為確認(rèn)中,然后通過回調(diào)確認(rèn)方法根據(jù)子事務(wù)表中的操作記錄將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中,若同步完成,則將子事務(wù)表中的狀態(tài)更新為確認(rèn)完成。該方案在嘗試(Try)階段先在前置表中操作,當(dāng)所有子事務(wù)都確認(rèn)嘗試完成后,再同時(shí)根據(jù)確認(rèn)消息提交各個(gè)子事務(wù),從而保證了各個(gè)子事務(wù)的一致性。若從業(yè)務(wù)系統(tǒng)經(jīng)過消息去重收到的消息為取消消息,則根據(jù)事務(wù)標(biāo)識(shí)在子事務(wù)表中查找與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的操作狀態(tài),若能夠查找到,說明之前操作已經(jīng)嘗試完成,則將操作狀態(tài)由嘗試完成更新為回滾中,然后根據(jù)子事務(wù)表中的操作記錄采用取消調(diào)用方法將之前對(duì)從業(yè)務(wù)前置表的操作進(jìn)行回滾,若回滾成功,則將子事務(wù)表中的操作狀態(tài)更新為回滾完成。若查找不到,說明之前操作失敗,即之前操作從業(yè)務(wù)前置表失敗,因此不需要進(jìn)行回滾操作,直接結(jié)束不做任何處理。
在一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)將分布式事務(wù)分為多個(gè)子事務(wù),并分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,該指令中包括事務(wù)標(biāo)識(shí)的步驟304包括:主業(yè)務(wù)系統(tǒng)將分布式事務(wù)分為多個(gè)子事務(wù)并設(shè)置各個(gè)子事務(wù)的執(zhí)行順序,按照?qǐng)?zhí)行順序向?qū)?yīng)的從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,指令中包括事務(wù)標(biāo)識(shí),當(dāng)接收到前一個(gè)子事務(wù)執(zhí)行結(jié)果為成功時(shí),才將后一個(gè)子事務(wù)的執(zhí)行命令發(fā)送到對(duì)應(yīng)的從業(yè)務(wù)系統(tǒng),若接收到前一個(gè)子事務(wù)的執(zhí)行結(jié)果為失敗,則不再執(zhí)行后面的子事務(wù)。
在本實(shí)施例中,主業(yè)務(wù)系統(tǒng)將分布式事務(wù)分為多個(gè)子事務(wù)同時(shí)設(shè)置各個(gè)子事務(wù)的執(zhí)行順序,按照預(yù)設(shè)的執(zhí)行順序向?qū)?yīng)的從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,當(dāng)然,指令中包括事務(wù)標(biāo)識(shí)。后一個(gè)子事務(wù)的執(zhí)行是以前一個(gè)子事務(wù)的執(zhí)行結(jié)果為依據(jù)的,只有前一個(gè)子事務(wù)執(zhí)行成功,才會(huì)將后一個(gè)子事務(wù)的執(zhí)行命令發(fā)送給從業(yè)務(wù)系統(tǒng),若前一個(gè)子事務(wù)執(zhí)行失敗,根據(jù)事務(wù)的ACID性,整個(gè)分布式事務(wù)已經(jīng)確認(rèn)為執(zhí)行失敗,所以不需要再執(zhí)行后面的子事務(wù)。通過該方法每個(gè)只需要鎖定一個(gè)子事務(wù)資源,避免了同時(shí)占用大量的資源,能夠做到及時(shí)回滾。
在一個(gè)實(shí)施例中,上述分布式事務(wù)處理方法還包括:在主業(yè)務(wù)系統(tǒng)和各個(gè)從業(yè)務(wù)系統(tǒng)中都設(shè)置有一個(gè)檢查機(jī)制,檢查機(jī)制用于監(jiān)控主事務(wù)表或子事務(wù)表中事務(wù)的操作狀態(tài),若發(fā)現(xiàn)操作狀態(tài)異常,則根據(jù)事務(wù)表中的記錄向消息系統(tǒng)再次發(fā)送確認(rèn)消息或取消消息以更改操作狀態(tài)。
在本實(shí)施例中,由于主業(yè)務(wù)系統(tǒng)可能在向消息系統(tǒng)成功發(fā)送確認(rèn)消息或取消消息后還沒來得及更改操作狀態(tài)就出現(xiàn)故障或掉線,從業(yè)務(wù)系統(tǒng)也可能出現(xiàn)在收到確認(rèn)消息或取消消息后還沒來得及更新狀態(tài)就出現(xiàn)故障或掉線的情況,那么當(dāng)系統(tǒng)恢復(fù)正常后,主事務(wù)表或子事務(wù)表中的狀態(tài)就會(huì)處于異常狀態(tài)。為了能夠及時(shí)的將異常狀態(tài)進(jìn)行修復(fù),通過在每個(gè)主業(yè)務(wù)系統(tǒng)和各個(gè)從業(yè)務(wù)系統(tǒng)中各設(shè)置一個(gè)檢查機(jī)制,該檢查機(jī)制用于監(jiān)控主事務(wù)表或子事務(wù)表中事務(wù)的操作狀態(tài),若發(fā)現(xiàn)操作狀態(tài)異常,則根據(jù)事務(wù)表中的記錄向消息系統(tǒng)再次發(fā)送確認(rèn)消息或取消消息以更改操作狀態(tài),從而實(shí)現(xiàn)了事務(wù)的最終一致性。
如圖4所示,在一個(gè)具體的實(shí)施例中,一種分布式事務(wù)處理的方法應(yīng)用于如圖4所示的應(yīng)用環(huán)境中,在該應(yīng)用環(huán)境中,包括:商城系統(tǒng)402,庫存系統(tǒng)404,訂單系統(tǒng)406、消息系統(tǒng)408。具體地,首先,商城系統(tǒng)402接收一個(gè)處理用戶購買某個(gè)物品的分布式事務(wù),為該分布式事務(wù)分配一個(gè)事務(wù)編號(hào),然后在商城數(shù)據(jù)庫中的事務(wù)表中插入一條記載該事務(wù)狀態(tài)的記錄,此時(shí),事務(wù)狀態(tài)為開啟(BEGIN),記錄中除了包括事務(wù)狀態(tài)還包括事務(wù)編號(hào)、業(yè)務(wù)流水號(hào)、業(yè)務(wù)類型、事務(wù)類型以及產(chǎn)生的時(shí)間等,表1為一個(gè)實(shí)施例中,事務(wù)表中的一條記錄的示意圖。
表1
進(jìn)一步的,商城系統(tǒng)402根據(jù)預(yù)設(shè)的規(guī)則將該分布式事務(wù)分為兩個(gè)子事務(wù),一個(gè)是減庫存,一個(gè)是新增訂單,顯然,可以采串行的方法進(jìn)行子事務(wù)的處理,即先進(jìn)行減庫存,若減庫存成功,再進(jìn)行新增訂單。所以商城系統(tǒng)402首先將減庫存的子事務(wù)發(fā)送到庫存系統(tǒng)404進(jìn)行執(zhí)行,庫存系統(tǒng)404在庫存前置表中進(jìn)行減庫存的操作,若操作成功,則在庫存數(shù)據(jù)庫中的事務(wù)表中插入一條標(biāo)識(shí)子事務(wù)操作狀態(tài)的記錄,此時(shí),事務(wù)狀態(tài)為嘗試完成(TRIED)。若操作失敗,則說明沒有足夠庫存,不會(huì)在庫存事務(wù)表中插入任何記錄。商城系統(tǒng)402若收到減庫存操作成功的信息,將把新增訂單的子事務(wù)發(fā)送到訂單系統(tǒng)406進(jìn)行執(zhí)行,同樣的,訂單系統(tǒng)406在訂單前置表中進(jìn)行新增訂單的操作,若操作成功,則在訂單數(shù)據(jù)庫中的事務(wù)表中插入一條標(biāo)識(shí)子事務(wù)狀態(tài)的記錄,事務(wù)狀態(tài)同樣為嘗試完成(TRIED),若操作失敗,則不會(huì)插入任務(wù)記錄。商城系統(tǒng)402若收到減庫存操作失敗的信息,則不會(huì)再執(zhí)行新增訂單的操作,直接判定該分布式事務(wù)執(zhí)行失敗,然后將商城數(shù)據(jù)庫中的事務(wù)表中的事務(wù)狀態(tài)由開啟(BEGIN)更新為回滾中(CANCELLING)。若減庫存操作成功,而新增訂單操作失敗,同樣的會(huì)判定該分布式事務(wù)執(zhí)行失敗,事務(wù)狀態(tài)同樣會(huì)由開啟(BEGIN)更新為回滾中(CANCELLING),然后向消息系統(tǒng)408發(fā)送取消消息,取消消息發(fā)送成功后,將會(huì)將商城數(shù)據(jù)庫中事務(wù)表中的事務(wù)狀態(tài)由回滾中(CANCELLING)更新為回滾完成(CANCELLED)。只有減庫存和新增訂單都操作成功,才會(huì)將商城數(shù)據(jù)庫中事務(wù)表中的事務(wù)狀態(tài)由開啟(BEGIN)更新為嘗試完成(TRIED)。然后向消息系統(tǒng)408發(fā)送確認(rèn)消息,確認(rèn)消息發(fā)送成功后,將會(huì)將商城數(shù)據(jù)庫中事務(wù)表中的事務(wù)狀態(tài)由嘗試完成(TRIED)更新為確認(rèn)完成(CONFIRMED)。消息系統(tǒng)408將取消消息或確認(rèn)消息同時(shí)發(fā)送給庫存系統(tǒng)404和訂單系統(tǒng)406。庫存系統(tǒng)404和訂單系統(tǒng)406若收到的是確認(rèn)消息,則經(jīng)過消息去重后,將各自事務(wù)表中的事務(wù)狀態(tài)由嘗試完成(TRIED)更新為確認(rèn)中(CONFIRMING),然后根據(jù)事務(wù)表中之前操作前置表的記錄將之前對(duì)庫存前置表和訂單前置表的操作同步到對(duì)應(yīng)的庫存主表和訂單主表中,同步成功后,將各自事務(wù)表中的事務(wù)狀態(tài)由確認(rèn)中(CONFIRMING)更新為確認(rèn)完成(CONFIRMED),從而實(shí)現(xiàn)了事務(wù)的一致性。庫存系統(tǒng)404和訂單系統(tǒng)406若收到的是取消消息,則經(jīng)過消息去重后,將各自事務(wù)表中的事務(wù)狀態(tài)(若存在的話)由嘗試完成(TRIED)更新為回滾中(CANCELLING),然后根據(jù)事務(wù)表中之前操作前置表的記錄對(duì)前置表進(jìn)行回滾,然后將事務(wù)表中的事務(wù)狀態(tài)由回滾中(CANCELLING)更新為回滾完成(CANCELLED)。需要說明的是,若在事務(wù)表中找不到對(duì)應(yīng)的事務(wù)狀態(tài)時(shí),則不用進(jìn)行任何處理,這是因?yàn)槿绻聞?wù)表中不存在對(duì)應(yīng)的事務(wù)狀態(tài)時(shí),說明之前的操作失敗或者是沒有進(jìn)行操作,所以就不需要進(jìn)行回滾。此外,若商城系統(tǒng)或庫存系統(tǒng)或訂單系統(tǒng)突然故障或掉線,有可能出現(xiàn)事務(wù)表中的事務(wù)狀態(tài)沒能及時(shí)更新的情況,而為了事務(wù)能夠保證事務(wù)最終一致性,需要在每個(gè)系統(tǒng)都布置一個(gè)檢查機(jī)制,該檢查機(jī)制用來監(jiān)控各個(gè)事務(wù)的事務(wù)狀態(tài),若出現(xiàn)異常,則向消息系統(tǒng)重新發(fā)送確認(rèn)消息或取消消息,以便更改事務(wù)的狀態(tài)。舉一個(gè)例子,若商城系統(tǒng)402向消息系統(tǒng)408發(fā)送確認(rèn)消息成功后,還沒來得及將事務(wù)表中的事務(wù)狀態(tài)由確認(rèn)中(CONFIRMING)更新為確認(rèn)完成(CONFIRMED),商城系統(tǒng)就出故障了,那么當(dāng)商城系統(tǒng)402恢復(fù)后,事務(wù)狀態(tài)還是處于確認(rèn)中(CONFIRMING),當(dāng)檢查機(jī)制發(fā)現(xiàn)事務(wù)狀態(tài)一直處于確認(rèn)中(CONFIRMING)時(shí),則向消息系統(tǒng)重新發(fā)送確認(rèn)消息,確認(rèn)消息發(fā)送成功后,將會(huì)將商城數(shù)據(jù)庫中事務(wù)表中的狀態(tài)由確認(rèn)中(CONFIRMING)更新為確認(rèn)完成(CONFIRMED)。
如圖5所示,在一個(gè)實(shí)施例中,提出了一種分布式事務(wù)處理系統(tǒng),該述系統(tǒng)包括:
主業(yè)務(wù)系統(tǒng)502,用于接收分布式事務(wù)的開啟請(qǐng)求,根據(jù)開啟請(qǐng)求為分布式事務(wù)分配一個(gè)事務(wù)標(biāo)識(shí),將事務(wù)標(biāo)識(shí)和對(duì)應(yīng)的開啟狀態(tài)記錄到主事務(wù)表中,主事務(wù)表存儲(chǔ)在主業(yè)務(wù)數(shù)據(jù)庫中,并將分布式事務(wù)分為多個(gè)子事務(wù),分別向?qū)?yīng)的各個(gè)從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,指令中包括事務(wù)標(biāo)識(shí);
從業(yè)務(wù)系統(tǒng)504,從業(yè)務(wù)系統(tǒng)有多個(gè),用于根據(jù)執(zhí)行子事務(wù)的指令在從業(yè)務(wù)前置表中進(jìn)行對(duì)應(yīng)的操作,若操作成功,則根據(jù)事務(wù)標(biāo)識(shí)生成一條標(biāo)識(shí)當(dāng)前子事務(wù)操作狀態(tài)的記錄插入到子事務(wù)表中,若操作失敗,則不記錄,其中,從業(yè)務(wù)前置表為從業(yè)務(wù)主表的復(fù)制表,從業(yè)務(wù)前置表和子事務(wù)表都存儲(chǔ)在對(duì)應(yīng)的從業(yè)務(wù)數(shù)據(jù)庫中;
主業(yè)務(wù)系統(tǒng)502還用于獲取各個(gè)子事務(wù)的操作結(jié)果,并根據(jù)操作結(jié)果更新主事務(wù)表中的操作狀態(tài),若所有子事務(wù)全部操作成功,則向消息系統(tǒng)發(fā)送確認(rèn)消息,若至少一個(gè)子事務(wù)操作失敗,則向消息系統(tǒng)發(fā)送取消消息;
消息系統(tǒng)506,用于將確認(rèn)消息或取消消息發(fā)送給對(duì)應(yīng)的各個(gè)從業(yè)務(wù)系統(tǒng);
從業(yè)務(wù)系統(tǒng)504還用于若接收到的消息為確認(rèn)消息,則將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中以完成對(duì)應(yīng)子事務(wù)的提交,若接收到的消息為取消消息,則直接將之前在從業(yè)務(wù)前置表中的操作進(jìn)行回滾。
在一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)502還用于獲取各個(gè)子事務(wù)的操作結(jié)果,若所有子事務(wù)全部操作成功,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為嘗試完成,然后向消息系統(tǒng)發(fā)送確認(rèn)消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)完成;若至少一個(gè)子事務(wù)操作失敗,則將主事務(wù)表中的操作狀態(tài)由開啟狀態(tài)更新為回滾中,然后向消息系統(tǒng)發(fā)送取消消息,若消息發(fā)送成功,則將主事務(wù)表中的操作狀態(tài)由回滾中更新為回滾完成。
在一個(gè)實(shí)施例中,從業(yè)務(wù)系統(tǒng)504還用于若收到的消息為確認(rèn)消息,則根據(jù)確認(rèn)消息將子事務(wù)表中的操作狀態(tài)由嘗試完成更新為確認(rèn)中,然后根據(jù)子事務(wù)表中的操作記錄將之前在從業(yè)務(wù)前置表中的操作同步到從業(yè)務(wù)主表中,若同步成功,則將子事務(wù)表中的狀態(tài)更新為確認(rèn)完成;若收到的消息為取消消息,則根據(jù)事務(wù)標(biāo)識(shí)在子事務(wù)表中查找與該事務(wù)標(biāo)識(shí)對(duì)應(yīng)的操作狀態(tài),若能夠查找到,則將操作狀態(tài)更新為回滾中,然后根據(jù)子事務(wù)表中的操作記錄將之前對(duì)從業(yè)務(wù)前置表的操作進(jìn)行回滾,若回滾成功,則將子事務(wù)表中的操作狀態(tài)更新為回滾完成,若查找不到,則結(jié)束。
在一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)502將分布式事務(wù)分為多個(gè)子事務(wù)并設(shè)置各個(gè)子事務(wù)的執(zhí)行順序,按照?qǐng)?zhí)行順序向?qū)?yīng)的從業(yè)務(wù)系統(tǒng)發(fā)送執(zhí)行子事務(wù)的指令,指令中包括事務(wù)標(biāo)識(shí),當(dāng)接收到前一個(gè)子事務(wù)執(zhí)行結(jié)果為成功時(shí),才將后一個(gè)子事務(wù)的執(zhí)行命令發(fā)送到對(duì)應(yīng)的從業(yè)務(wù)系統(tǒng),若接收到前一個(gè)子事務(wù)的執(zhí)行結(jié)果為失敗,則不再執(zhí)行后面的子事務(wù)。
在一個(gè)實(shí)施例中,主業(yè)務(wù)系統(tǒng)502和各個(gè)從業(yè)務(wù)系統(tǒng)504還用于通過設(shè)置的檢查機(jī)制監(jiān)控主事務(wù)表或子事務(wù)表中事務(wù)的操作狀態(tài),若發(fā)現(xiàn)操作狀態(tài)異常,則根據(jù)事務(wù)表中的記錄向消息系統(tǒng)再次發(fā)送確認(rèn)消息或取消消息以更改操作狀態(tài)。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過計(jì)算機(jī)程序來指令相關(guān)的硬件來完成,該計(jì)算機(jī)程序可存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,前述的存儲(chǔ)介質(zhì)可為磁碟、光盤、只讀存儲(chǔ)記憶體(Read-Only Memory,ROM)等非易失性存儲(chǔ)介質(zhì),或隨機(jī)存儲(chǔ)記憶體(Random Access Memory,RAM)等。
以上所述實(shí)施例的各技術(shù)特征可以進(jìn)行任意的組合,為使描述簡(jiǎn)潔,未對(duì)上述實(shí)施例中的各個(gè)技術(shù)特征所有可能的組合都進(jìn)行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說明書記載的范圍。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。