本申請(qǐng)涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及一種事務(wù)處理方法及裝置。
背景技術(shù):
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,以及社交網(wǎng)絡(luò)、智能設(shè)備的發(fā)展和應(yīng)用,使得數(shù)據(jù)量呈爆炸式增長(zhǎng)。為了應(yīng)對(duì)海量數(shù)據(jù)的存儲(chǔ)使用,相應(yīng)地產(chǎn)生了分布式數(shù)據(jù)庫(kù)。
分布式數(shù)據(jù)庫(kù)可以是由多個(gè)數(shù)據(jù)庫(kù)服務(wù)器(databaseserver)組成的,每個(gè)databaseserver都可以提供全部或者部分?jǐn)?shù)據(jù)的讀寫(xiě)服務(wù)。通常,分布式數(shù)據(jù)庫(kù)支持事務(wù)并發(fā)的處理。這里的事務(wù)可以是指,對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的操作(如增、刪、改、查)。例如在處理并發(fā)事務(wù)時(shí),分布式數(shù)據(jù)庫(kù)可以將不同事務(wù)分配給不同的數(shù)據(jù)庫(kù)服務(wù)器處理;再例如可以通過(guò)mvcc(multi-versionconcurrencycontrol,多版本并發(fā)控制)來(lái)實(shí)現(xiàn)事務(wù)并發(fā)處理。
具體地,分布式數(shù)據(jù)庫(kù)中維護(hù)有一個(gè)全局最大版本號(hào),通常業(yè)內(nèi)稱為globalcommitedversion。一般的,版本號(hào)的大小可以表示了分布式數(shù)據(jù)庫(kù)中數(shù)據(jù)修改(如新增)的時(shí)間前后,版本號(hào)越大則數(shù)據(jù)修改的越晚。通常,可以使用時(shí)間戳(timestamp)如unixtimestamp作為版本號(hào)使用。所述全局最大版本號(hào)可以確定所述分布式數(shù)據(jù)庫(kù)中最后一個(gè)修改的數(shù)據(jù)。
現(xiàn)有技術(shù)中事務(wù)處理時(shí),存在獲取全局最大版本號(hào)的效率較低或者可靠性較差的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)?zhí)峁┑囊环N事務(wù)處理方法及裝置,以解決現(xiàn)有事務(wù)處理時(shí),存在獲取全局最大版本號(hào)的效率較低或者可靠性較差的問(wèn)題。
根據(jù)本申請(qǐng)實(shí)施例提供的一種事務(wù)處理方法,所述方法應(yīng)用在分布式數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)服務(wù)器,所述方法包括:
針對(duì)待處理的事務(wù),向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;其中,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成;
在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào);
指定所獲取的全局最大版本號(hào)為所述待處理的事務(wù)的快照版本號(hào),從而執(zhí)行所述待處理的事務(wù)。
可選的,所述向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求,具體包括:
向版本號(hào)服務(wù)器組中的主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;
所述基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào),具體包括:
獲取所述應(yīng)答報(bào)文中攜帶的全局最大版本號(hào)。
可選的,所述向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求,具體包括:
向版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的獲取請(qǐng)求;
所述在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào),具體包括:
在預(yù)設(shè)的等待時(shí)長(zhǎng)內(nèi),判斷返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述應(yīng)答報(bào)文攜帶有版本號(hào)服務(wù)器的局部最大版本號(hào);
若是,將最大的局部最大版本號(hào)確定為全局最大版本號(hào)。
可選的,所述方法還包括:
在所述事務(wù)執(zhí)行完畢后,給所述事務(wù)分配一個(gè)比所述全局最大版本號(hào)大的事務(wù)版本號(hào);
向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求;其中,所述更新請(qǐng)求中攜帶有所述事務(wù)版本號(hào),并用于請(qǐng)求將全局最大版本號(hào)更新為所述事務(wù)版本號(hào);
提交所述執(zhí)行完畢的事務(wù)。
可選的,所述在所述事務(wù)執(zhí)行完畢后,給所述事務(wù)分配一個(gè)比所述全局最大版本號(hào)大的事務(wù)版本號(hào),具體包括:
在所述事務(wù)執(zhí)行完畢后,再次向所述版本號(hào)服務(wù)器組獲取全局最大版本號(hào);
給所述事務(wù)分配一個(gè)比所述再次獲取到的全局最大版本號(hào)大的事務(wù)版本號(hào)。
可選的,所述向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求,具體包括:
向所述版本號(hào)服務(wù)器組中主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的更新請(qǐng)求。
可選的,所述提交所述執(zhí)行完畢的事務(wù),具體包括:
在接收到所述主版本號(hào)服務(wù)器返回第二應(yīng)答報(bào)文后,提交所述執(zhí)行完畢的事務(wù);其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
可選的,所述向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求,具體包括:
向所述版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的更新請(qǐng)求。
可選的,所述提交所述執(zhí)行完畢的事務(wù),具體包括:
在預(yù)設(shè)的第二等待時(shí)長(zhǎng)內(nèi),判斷返回的第二應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述第二應(yīng)答報(bào)文表示版本號(hào)服務(wù)器收到該更新請(qǐng)求。
若是,提交所述執(zhí)行完畢的事務(wù)。
根據(jù)本申請(qǐng)實(shí)施例提供的一種事務(wù)處理方法,所述方法應(yīng)用在分布式數(shù)據(jù)庫(kù)中的版本號(hào)服務(wù)器組,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成,所述方法包括:
接收到數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的全局最大版本號(hào)的獲取請(qǐng)求;
將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
可選的,所述將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器,具體包括:
將主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
可選的,所述將主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器,具體包括:
在主版本服務(wù)器不可用的情況下,從所述版本號(hào)服務(wù)器組中選取一個(gè)備用版本號(hào)服務(wù)器;
將所述備用版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
可選的,所述方法還包括:
所述主版本號(hào)服務(wù)器接收所述數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
所述主版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的全局最大版本號(hào);
若是,所述主版本號(hào)服務(wù)器將所述事務(wù)版本號(hào)確定為新的全局最大版本號(hào)。
可選的,在所述主版本號(hào)服務(wù)器將所述事務(wù)版本號(hào)確定為新的全局最大版本號(hào)之后,所述方法還包括:
所述主版本號(hào)服務(wù)器向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
可選的,所述將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器,具體包括:
將所有版本號(hào)服務(wù)器維護(hù)的局部最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
可選的,所述方法還包括:
各個(gè)版本號(hào)服務(wù)器接收數(shù)據(jù)庫(kù)服務(wù)器廣播的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
各個(gè)版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的局部最大版本號(hào);
若是,則將所述事務(wù)版本號(hào)確定為其新的局部最大版本號(hào)。
可選的,所述方法還包括:
在所述事務(wù)版本號(hào)大于或者不大于其維護(hù)的局部最大版本號(hào)的情況下,向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示收到該更新請(qǐng)求。
根據(jù)本申請(qǐng)實(shí)施例提供的一種事務(wù)處理裝置,所述裝置應(yīng)用在分布式數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)服務(wù)器,所述裝置包括:
發(fā)送單元,針對(duì)待處理的事務(wù),向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;其中,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成;
獲取單元,在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào);
執(zhí)行單元,指定所獲取的全局最大版本號(hào)為所述待處理的事務(wù)的快照版本號(hào),從而執(zhí)行所述待處理的事務(wù)。
根據(jù)本申請(qǐng)實(shí)施例提供的一種事務(wù)處理裝置,所述裝置應(yīng)用在分布式數(shù)據(jù)庫(kù)中的版本號(hào)服務(wù)器組,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成,所述裝置包括:
接收單元,接收到數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的全局最大版本號(hào)的獲取請(qǐng)求;
返回單元,將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
本申請(qǐng)實(shí)施例中,通過(guò)設(shè)置一個(gè)由多個(gè)(即至少兩個(gè))用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成的版本號(hào)服務(wù)器組,所述多個(gè)為遠(yuǎn)小于所有數(shù)據(jù)庫(kù)服務(wù)器的個(gè)數(shù)。在處理事務(wù)的數(shù)據(jù)庫(kù)獲取全局最大版本號(hào)時(shí),由于存在多個(gè)版本號(hào)服務(wù)器,所有可以避免使用中心節(jié)點(diǎn)時(shí)發(fā)生中心節(jié)點(diǎn)不可用所造成無(wú)法獲取全局最大版本號(hào)的問(wèn)題。而且,由于多個(gè)版本號(hào)服務(wù)器遠(yuǎn)小于所有數(shù)據(jù)庫(kù)服務(wù)器的個(gè)數(shù),所以也可以避免了向所有數(shù)據(jù)庫(kù)服務(wù)器獲取局部最大版本號(hào)來(lái)確定全局最大版本號(hào)所造成效率低的問(wèn)題;所以本申請(qǐng)實(shí)施例中數(shù)據(jù)庫(kù)服務(wù)器在執(zhí)行事務(wù)中,可以實(shí)現(xiàn)兼顧獲取全局最大版本號(hào)的效率以及可靠性,從而提升事務(wù)處理性能。
附圖說(shuō)明
圖1為本申請(qǐng)一實(shí)施例提供的事務(wù)處理方法的流程圖;
圖2為本申請(qǐng)一實(shí)施例提供的分布式數(shù)據(jù)庫(kù)的架構(gòu)示意圖;
圖3為本申請(qǐng)一實(shí)施例提供的數(shù)據(jù)庫(kù)服務(wù)器獲取所有版本號(hào)服務(wù)器的局部最大版本號(hào)過(guò)程的示意圖;
圖4為本申請(qǐng)一實(shí)施例提供的數(shù)據(jù)庫(kù)服務(wù)器獲取主版本號(hào)服務(wù)器的全局最大版本號(hào)過(guò)程的示意圖;
圖5為本申請(qǐng)一實(shí)施例提供的事務(wù)處理方法的流程圖;
圖6為本申請(qǐng)一實(shí)施例提供的事務(wù)處理方法的流程圖;
圖7是本申請(qǐng)?zhí)峁┑氖聞?wù)處理裝置所在設(shè)備的一種硬件結(jié)構(gòu)圖;
圖8為本申請(qǐng)一實(shí)施例提供的事務(wù)處理裝置的模塊示意圖;
圖9為本申請(qǐng)一實(shí)施例提供的事務(wù)處理裝置的模塊示意圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說(shuō)明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書(shū)中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。
在本申請(qǐng)使用的術(shù)語(yǔ)是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書(shū)中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語(yǔ)“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。
應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語(yǔ)第一、第二、第三等來(lái)描述各種信息,但這些信息不應(yīng)限于這些術(shù)語(yǔ)。這些術(shù)語(yǔ)僅用來(lái)將同一類(lèi)型的信息彼此區(qū)分開(kāi)。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱為第二信息,類(lèi)似地,第二信息也可以被稱為第一信息。取決于語(yǔ)境,如在此所使用的詞語(yǔ)“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
相關(guān)技術(shù)中,數(shù)據(jù)庫(kù)服務(wù)器在處理事務(wù)之前,會(huì)給該事務(wù)分配一個(gè)快照版本號(hào),通常業(yè)內(nèi)稱為snapshotversion;所述快照版本號(hào)用于表示該事務(wù)可以讀取到的數(shù)據(jù)范圍(只能讀取到比snapshotversion小的版本號(hào)所對(duì)應(yīng)的數(shù)據(jù))。一般的,所述快照版本號(hào)就是所述全局最大版本號(hào),這樣事務(wù)就可以讀取到當(dāng)前所有的數(shù)據(jù)。也就是說(shuō),數(shù)據(jù)庫(kù)服務(wù)器在真正處理事務(wù)前,需要先獲取當(dāng)前的全局最大版本號(hào),再分配事務(wù)對(duì)應(yīng)的快照版本號(hào)。
現(xiàn)有技術(shù)中,主要存在如下兩種維護(hù)全局最大版本號(hào)(globalcommitedversion)的方式:
第一種方式中,分布式數(shù)據(jù)庫(kù)中每個(gè)數(shù)據(jù)庫(kù)服務(wù)器(databaseserver)本地都會(huì)維護(hù)一個(gè)局部最大版本號(hào)(local_max_commited_version)。不同數(shù)據(jù)庫(kù)服務(wù)器之間可以同步局部最大版本號(hào),從而保證每個(gè)數(shù)據(jù)庫(kù)服務(wù)器維護(hù)的局部最大版本號(hào)都相同,即每個(gè)局部最大版本號(hào)始終和全局最大版本號(hào)一致。具體地,每個(gè)數(shù)據(jù)庫(kù)服務(wù)器更新自身的局部最大版本號(hào)時(shí),都需要將更新后的局部最大版本號(hào)廣播到所有的數(shù)據(jù)庫(kù)服務(wù)器;任意一個(gè)數(shù)據(jù)庫(kù)服務(wù)器收到廣播后,如果發(fā)現(xiàn)本地維護(hù)的局部最大版本號(hào)比廣播的小,則也會(huì)更新。
對(duì)于待處理事務(wù)的數(shù)據(jù)庫(kù)服務(wù)器,其獲取全局最大版本號(hào)時(shí),直接將本地維護(hù)的局部最大版本號(hào)作為全局最大版本號(hào)即可。
第二種方式中,分布式數(shù)據(jù)庫(kù)會(huì)將一個(gè)數(shù)據(jù)庫(kù)服務(wù)器作為中心節(jié)點(diǎn),該中心節(jié)點(diǎn)用于專(zhuān)門(mén)維護(hù)全局最大版本號(hào)(globalcommitedversion)。
對(duì)于待處理事務(wù)的數(shù)據(jù)庫(kù)服務(wù)器,其獲取全局最大版本號(hào)時(shí),只需向該中心節(jié)點(diǎn)獲取對(duì)應(yīng)的全局最大版本號(hào)即可。
然而,針對(duì)第一種方式,雖然可以直接將本地維護(hù)的局部最大版本號(hào)作為全局最大版本號(hào),但是同步局部最大版本號(hào)的效率較低,例如分布式數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)服務(wù)器越多,則廣播所需時(shí)間也越多;而且,只有在接收到所有數(shù)據(jù)庫(kù)服務(wù)器返回應(yīng)答后,才可以完成同步。
針對(duì)第二種方式,一旦中心節(jié)點(diǎn)出現(xiàn)問(wèn)題導(dǎo)致不可用如發(fā)生宕機(jī),那么也將無(wú)法獲取到全局最大版本號(hào)。
綜上所述,現(xiàn)有技術(shù)中事務(wù)處理時(shí),存在獲取全局最大版本號(hào)的效率較低或者可靠性較差的問(wèn)題。
為了解決上述問(wèn)題,請(qǐng)參見(jiàn)圖1,為本申請(qǐng)一實(shí)施例提供的事務(wù)處理方法的流程圖,包括以下步驟:
步驟110:數(shù)據(jù)庫(kù)服務(wù)器針對(duì)待處理的事務(wù),向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求。
如前所述數(shù)據(jù)庫(kù)服務(wù)器在處理所述待處理的事務(wù)之前,需要給所述待處理的事務(wù)分配一個(gè)快照版本號(hào)(snapshotversion),而所述快照版本號(hào)是基于分布式數(shù)據(jù)庫(kù)中維護(hù)的全局最大版本號(hào)(globalcommitedversion)確定的。也就是說(shuō),所述數(shù)據(jù)庫(kù)服務(wù)器在處理待處理的事務(wù)之前,還需要獲取全局最大版本號(hào)。
本實(shí)施例中,請(qǐng)結(jié)合圖2所示的分布式數(shù)據(jù)庫(kù)的架構(gòu)示意圖,所述分布式數(shù)據(jù)庫(kù)中可以由至少兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器(databaseserver)組成,每個(gè)數(shù)據(jù)庫(kù)服務(wù)器都可以用于處理事務(wù)。如圖2所示,可以將至少兩個(gè)的數(shù)據(jù)庫(kù)服務(wù)器組成一個(gè)用于維護(hù)全局最大版本號(hào)的版本號(hào)服務(wù)器組。如此,在某個(gè)數(shù)據(jù)庫(kù)服務(wù)器需要處理事務(wù)時(shí),可以向所述版本號(hào)服務(wù)器組發(fā)送全局版本號(hào)的獲取請(qǐng)求。
為了便于區(qū)別,本文中將所述版本號(hào)服務(wù)器組中的數(shù)據(jù)庫(kù)服務(wù)器稱之為版本號(hào)服務(wù)器。值得一提的是,所述版本號(hào)服務(wù)器僅是邏輯意義上的服務(wù)器,其本質(zhì)可以是數(shù)據(jù)庫(kù)服務(wù)器。
在一個(gè)實(shí)施例中,所述步驟110向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求,具體可以包括:
向版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的獲取請(qǐng)求。
在本實(shí)施例中,所述版本號(hào)服務(wù)器組中的每一個(gè)版本號(hào)服務(wù)器中都可以維護(hù)有一個(gè)局部最大版本號(hào)(local_max_commited_version)。
一般的,所述局部最大版本號(hào)可以是一個(gè)64位的整數(shù),可以表示為以納秒或微妙為單位的unix時(shí)間戳。版本號(hào)服務(wù)器維護(hù)該局部最大版本號(hào),可以是記錄在內(nèi)存中,并且持久化數(shù)據(jù)。
值得一提的是,如果不進(jìn)行持久化,版本號(hào)服務(wù)器每次重啟之后,還需要同步誤差:即需要等待一個(gè)時(shí)鐘誤差(clock_diff_upper_limit),所述時(shí)鐘誤差表示不同版本號(hào)服務(wù)器之間的時(shí)鐘誤差上限;然后再把此時(shí)的unix時(shí)間戳設(shè)置為局部最大版本號(hào)。
本實(shí)施例中,版本號(hào)服務(wù)器可以提供一個(gè)用于獲取的rpc(remoteprocedurecallprotocol,遠(yuǎn)程過(guò)程調(diào)用協(xié)議)接口:獲取接口get_version()。所述數(shù)據(jù)庫(kù)服務(wù)器可以通過(guò)get_version()獲取版本號(hào)服務(wù)器的局部最大版本號(hào)。
在另一個(gè)實(shí)施例中,在所述版本號(hào)服務(wù)器組中,可以將一個(gè)版本號(hào)服務(wù)器作為主版本號(hào)服務(wù)器,其它的版本號(hào)服務(wù)器作為備份版本號(hào)服務(wù)器。
如此,所述步驟110向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求,具體可以包括:
向版本號(hào)服務(wù)器組中的主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的獲取請(qǐng)求。
在本實(shí)施例中,所述主版本號(hào)服務(wù)器維護(hù)有一個(gè)全局最大版本號(hào)。
一般的,所述全局最大版本號(hào)可以是一個(gè)64位的整數(shù),可以表示為以納秒或微妙為單位的unix時(shí)間戳。所述主版本號(hào)服務(wù)器維護(hù)該全局最大版本號(hào),可以是記錄在內(nèi)存中,并且持久化數(shù)據(jù)。
值得一提的是,如果不進(jìn)行持久化,版本號(hào)服務(wù)器每次重啟之后,還需要同步誤差:即需要等待一個(gè)時(shí)鐘誤差(clock_diff_upper_limit),所述時(shí)鐘誤差表示不同版本號(hào)服務(wù)器之間的時(shí)鐘誤差上限;然后再把此時(shí)的unix時(shí)間戳設(shè)置為全局最大版本號(hào)。
本實(shí)施例中,主版本號(hào)服務(wù)器可以提供一個(gè)用于獲取的rpc(remoteprocedurecallprotocol,遠(yuǎn)程過(guò)程調(diào)用協(xié)議)接口:
獲取接口get_version():數(shù)據(jù)庫(kù)服務(wù)器可以通過(guò)廣播get_version()獲取主版本號(hào)服務(wù)器的局部最大版本。
值得一提的是,如果版本號(hào)服務(wù)器不是主版本號(hào)服務(wù)器,則其收到獲取請(qǐng)求或者更新請(qǐng)求后,還可以返回一個(gè)錯(cuò)誤碼;而數(shù)據(jù)庫(kù)服務(wù)器收到錯(cuò)誤碼后可以重新向主版本號(hào)服務(wù)器發(fā)送請(qǐng)求。如此,可以確保數(shù)據(jù)庫(kù)服務(wù)器始終是向主版本號(hào)服務(wù)器發(fā)送請(qǐng)求的。
步驟120:版本號(hào)服務(wù)器組接收數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的全局最大版本號(hào)的獲取請(qǐng)求。
步驟121:版本號(hào)服務(wù)器組將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
本實(shí)施例中,如果步驟120中,版本號(hào)服務(wù)器組中的各個(gè)版本號(hào)服務(wù)器都接收到了數(shù)據(jù)庫(kù)服務(wù)器廣播的全局最大版本號(hào)的獲取請(qǐng)求;
則,所述步驟121,具體可以包括:
版本號(hào)服務(wù)器組將所有版本號(hào)服務(wù)器維護(hù)的局部最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
如果步驟120中,版本號(hào)服務(wù)器組中的主版本號(hào)服務(wù)器接收到了數(shù)據(jù)庫(kù)服務(wù)器廣播的全局最大版本號(hào)的獲取請(qǐng)求;
則,所述步驟121,具體可以包括:
將主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
步驟130:所述數(shù)據(jù)庫(kù)服務(wù)器在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào)。
針對(duì)步驟110中,向版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的獲取請(qǐng)求;
則所述步驟130,具體可以包括:
在預(yù)設(shè)的等待時(shí)長(zhǎng)內(nèi),判斷返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述應(yīng)答報(bào)文攜帶有版本號(hào)服務(wù)器的局部最大版本號(hào);
若是,將最大的局部最大版本號(hào)確定為全局最大版本號(hào)。
本實(shí)施例中,如前所述,數(shù)據(jù)庫(kù)服務(wù)器向所有的版本號(hào)服務(wù)器廣播了get_version()請(qǐng)求之后,然后可以等待各個(gè)版本號(hào)服務(wù)器的應(yīng)答。在返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值到達(dá)預(yù)設(shè)比例之后,所述數(shù)據(jù)庫(kù)服務(wù)器可以從這些應(yīng)答報(bào)文攜帶的局部最大版本號(hào)中選取一個(gè)最大值,這個(gè)最大值就是全局最大版本號(hào)globalcommitedversion。需要說(shuō)明的是,如果在返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值沒(méi)有到達(dá)預(yù)設(shè)比例的情況下,那么這次獲取請(qǐng)求就失敗了,該數(shù)據(jù)庫(kù)服務(wù)器可以再次獲取。
所述等待時(shí)長(zhǎng)可以是人為設(shè)置的一個(gè)經(jīng)驗(yàn)值。例如30秒。
所述預(yù)設(shè)比例可以是人為設(shè)置的一個(gè)經(jīng)驗(yàn)值。通常,可以設(shè)置為1/2,即判斷返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)1/2。
如圖3所示數(shù)據(jù)庫(kù)服務(wù)器獲取所有版本號(hào)服務(wù)器的局部最大版本號(hào)過(guò)程的示意圖。版本號(hào)服務(wù)器組包含3個(gè)版本號(hào)服務(wù)器;
t1時(shí)刻,數(shù)據(jù)庫(kù)服務(wù)器向所有3個(gè)版號(hào)服務(wù)器廣播get_version()請(qǐng)求;
在預(yù)設(shè)的等待時(shí)長(zhǎng)內(nèi),t2時(shí)候收到版本號(hào)服務(wù)器1的應(yīng)答,該應(yīng)答報(bào)文攜帶局部最大版本號(hào)v1;
t3時(shí)刻收到版本號(hào)服務(wù)器2的應(yīng)答,該應(yīng)答報(bào)文攜帶局部最大版本號(hào)v2;
由于t3時(shí)刻已經(jīng)收到超過(guò)一半的版本號(hào)服務(wù)器的應(yīng)答,所以可以從這兩個(gè)應(yīng)答中選取值大的局部最大版本號(hào),即max(v1,v2)作為全局最大版本號(hào)。
針對(duì)步驟110中,向版本號(hào)服務(wù)器組中的主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的獲取請(qǐng)求。
所述步驟130,具體可以包括:
獲取所述應(yīng)答報(bào)文中攜帶的全局最大版本號(hào)。
如圖4所示數(shù)據(jù)庫(kù)服務(wù)器獲取主版本號(hào)服務(wù)器的全局最大版本號(hào)過(guò)程的示意圖。版本號(hào)服務(wù)器組包含2個(gè)版本號(hào)服務(wù)器,版本號(hào)服務(wù)器1是主版本號(hào)服務(wù)器,版本號(hào)服務(wù)器2是備用版本號(hào)服務(wù)器;
t1時(shí)刻,數(shù)據(jù)庫(kù)服務(wù)器向版本號(hào)服務(wù)器1發(fā)送get_version()請(qǐng)求;
t2時(shí)刻,收到了版本號(hào)服務(wù)器1的應(yīng)答,該應(yīng)答報(bào)文攜帶全局最大版本號(hào);
則,數(shù)據(jù)庫(kù)服務(wù)器就可以獲取該應(yīng)答攜帶的全局最大版本號(hào)。
值得一提的是,如果版本號(hào)服務(wù)器1在t2時(shí)刻之后宕機(jī)或網(wǎng)絡(luò)中斷變得不可用了;
t3時(shí)刻,數(shù)據(jù)庫(kù)服務(wù)器依然向版本號(hào)服務(wù)器1請(qǐng)求發(fā)送get_version()請(qǐng)求,但版本號(hào)服務(wù)器1已經(jīng)宕機(jī),所以這次請(qǐng)求失敗了;
然而很快版本號(hào)服務(wù)器2被選舉為新的主版本號(hào)服務(wù)器;
所以,在t4時(shí)刻,數(shù)據(jù)庫(kù)服務(wù)器可以把請(qǐng)求發(fā)給新的主版本號(hào)服務(wù)器,這次請(qǐng)求可以成功。從該例子可以得出只有在版本號(hào)服務(wù)器1不可用到版本號(hào)服務(wù)器2上任之間的這段時(shí)間數(shù)據(jù)庫(kù)服務(wù)器的請(qǐng)求才可能會(huì)失?。欢@段時(shí)間是很短的,所以該版本號(hào)服務(wù)器組可靠性較高。
步驟131:所述數(shù)據(jù)庫(kù)服務(wù)器指定所獲取的全局最大版本號(hào)為所述待處理的事務(wù)的快照版本號(hào),從而執(zhí)行所述待處理的事務(wù)。
本實(shí)施例中,數(shù)據(jù)庫(kù)服務(wù)器獲取到全局最大版本號(hào)之后,可以指定所獲取的全局最大版本號(hào)為所述待處理的事務(wù)的快照版本號(hào),從而執(zhí)行所述待處理的事務(wù)。
本申請(qǐng)實(shí)施例中,通過(guò)設(shè)置一個(gè)由多個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成的版本號(hào)服務(wù)器組,所述多個(gè)為遠(yuǎn)小于所有數(shù)據(jù)庫(kù)服務(wù)器的個(gè)數(shù)。在處理事務(wù)的數(shù)據(jù)庫(kù)獲取全局最大版本號(hào)時(shí),由于存在多個(gè)版本號(hào)服務(wù)器,所有可以避免使用中心節(jié)點(diǎn)時(shí)發(fā)生中心節(jié)點(diǎn)不可用所造成無(wú)法獲取全局最大版本號(hào)的問(wèn)題。而且,由于多個(gè)版本號(hào)服務(wù)器遠(yuǎn)小于所有數(shù)據(jù)庫(kù)服務(wù)器的個(gè)數(shù),所以也可以避免了向所有數(shù)據(jù)庫(kù)服務(wù)器獲取局部最大版本號(hào)來(lái)確定全局最大版本號(hào)所造成效率低的問(wèn)題;所以本申請(qǐng)實(shí)施例中數(shù)據(jù)庫(kù)服務(wù)器在執(zhí)行事務(wù)中,可以實(shí)現(xiàn)兼顧獲取全局最大版本號(hào)的效率以及可靠性,從而提升事務(wù)處理性能。
在實(shí)際應(yīng)用中,數(shù)據(jù)庫(kù)服務(wù)器在執(zhí)行完事務(wù)處理后,如果該事務(wù)需要修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)(例如新增數(shù)據(jù)),則還需要提交該事務(wù)。此時(shí),所述數(shù)據(jù)庫(kù)服務(wù)器還需要分配一個(gè)事務(wù)版本號(hào),通常業(yè)內(nèi)稱為commitversion。一般的,所述事務(wù)版本號(hào)需要比全局最大版本號(hào)大;在分布式數(shù)據(jù)庫(kù)中只有分配了事務(wù)版本號(hào)的事務(wù)才可以被提交。
如圖1所示,在所述步驟131之后,所述方法還可以包括:
步驟140:在所述事務(wù)執(zhí)行完畢后,所述數(shù)據(jù)庫(kù)服務(wù)器給所述事務(wù)分配一個(gè)比所述全局最大版本號(hào)大的事務(wù)版本號(hào)。
本實(shí)施例中,數(shù)據(jù)庫(kù)服務(wù)器可以在所述全局最大版本號(hào)的基礎(chǔ)上加1得到事務(wù)版本號(hào)的。
步驟141:所述數(shù)據(jù)庫(kù)服務(wù)器向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求。
本實(shí)施例中,所述更新請(qǐng)求中攜帶有所述事務(wù)版本號(hào),并用于請(qǐng)求將全局最大版本號(hào)更新為所述事務(wù)版本號(hào)。
與數(shù)據(jù)庫(kù)服務(wù)器向所述版本號(hào)服務(wù)器組發(fā)送獲取請(qǐng)求類(lèi)似的:
所述步驟141,具體可以包括:
向所述版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的更新請(qǐng)求。
本實(shí)施例中,所述版本號(hào)服務(wù)器組中的版本號(hào)服務(wù)器還可以提供一個(gè)用于更新的rpc接口:更新接口update_version(cv)。數(shù)據(jù)庫(kù)服務(wù)器可以通過(guò)update_version(cv)請(qǐng)求獲取所有版本號(hào)服務(wù)器更新維護(hù)的全局最大版本號(hào)。其中,cv為更新請(qǐng)求中攜帶的事務(wù)版本號(hào)。
與之對(duì)應(yīng)的,各個(gè)版本號(hào)服務(wù)器處理該更新請(qǐng)求的過(guò)程如下a1-a3所示:
a1:各個(gè)版本號(hào)服務(wù)器接收數(shù)據(jù)庫(kù)服務(wù)器廣播的更新請(qǐng)求;其中,所述更新請(qǐng)求中攜帶有所述事務(wù)版本號(hào),并用于請(qǐng)求將全局最大版本號(hào)更新為所述事務(wù)版本號(hào);
a2:各個(gè)版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的局部最大版本號(hào);
a3:若是,則將所述事務(wù)版本號(hào)確定為其新的局部最大版本號(hào)。
本實(shí)施例中,如果事務(wù)版本號(hào)大于版本號(hào)服務(wù)器維護(hù)的局部最大版本號(hào),則需要將所述事務(wù)版本號(hào)確定為新的局部最大版本號(hào);反之,如果事務(wù)版本號(hào)小于等于版本號(hào)服務(wù)器維護(hù)的局部最大版本號(hào),則不更新。
與前述版本號(hào)服務(wù)器組中,可以將一個(gè)版本號(hào)服務(wù)器作為主版本號(hào)服務(wù)器,其它的版本號(hào)服務(wù)器作為備份版本號(hào)服務(wù)器的實(shí)施例相對(duì)應(yīng)的,所述步驟141,具體可以包括:
向所述版本號(hào)服務(wù)器組中主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的更新請(qǐng)求。
本實(shí)施例中,所述版本號(hào)服務(wù)器組中的版本號(hào)服務(wù)器還可以提供一個(gè)用于更新的rpc接口:更新接口update_version(cv)。數(shù)據(jù)庫(kù)服務(wù)器可以通過(guò)update_version(cv)請(qǐng)求主版本號(hào)服務(wù)器更新維護(hù)的全局最大版本號(hào)。其中,cv為更新請(qǐng)求中攜帶的事務(wù)版本號(hào)。
與之對(duì)應(yīng)的,主版本號(hào)服務(wù)器處理該更新請(qǐng)求的過(guò)程如下b1-b3所示:
b1:所述主版本號(hào)服務(wù)器接收所述數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
b2:所述主版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的全局最大版本號(hào);
b3:若是,所述主版本號(hào)服務(wù)器將所述事務(wù)版本號(hào)確定為新的全局最大版本號(hào)。
本實(shí)施例中,如果事務(wù)版本號(hào)大于主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào),則需要將所述事務(wù)版本號(hào)確定為新的全局最大版本號(hào);反之,如果事務(wù)版本號(hào)小于等于主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào),則不更新。
步驟150:所述數(shù)據(jù)庫(kù)服務(wù)器提交所述執(zhí)行完畢的事務(wù)。
本實(shí)施例中,所述步驟150可以是在所述步驟141之后執(zhí)行的。也就是說(shuō),在所述數(shù)據(jù)庫(kù)服務(wù)器向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求之后,就可以提交所述執(zhí)行完畢的事務(wù)。
通過(guò)本實(shí)施例,數(shù)據(jù)庫(kù)服務(wù)可以實(shí)現(xiàn)對(duì)事務(wù)的提交。
在實(shí)際應(yīng)用中,事務(wù)處理到事務(wù)提交之間可能經(jīng)過(guò)了較長(zhǎng)時(shí)間,例如前一天處理事務(wù),一天后才需要事務(wù)提交;那么,數(shù)據(jù)庫(kù)服務(wù)器獲取到的全局最大版本號(hào)還是前一天處理事務(wù)之前的,而由于分布式數(shù)據(jù)庫(kù)支持并發(fā)事務(wù),在這一天中真是的全局最大版本號(hào)通常已經(jīng)更新過(guò)了;這樣,基于過(guò)時(shí)的全局最大版本號(hào)分配的事務(wù)版本號(hào)時(shí),很有可能比真正的全局最大版本號(hào)小。
為了解決這一問(wèn)題,在本申請(qǐng)的又一個(gè)實(shí)施例中,所述步驟140,具體包括:
在所述事務(wù)執(zhí)行完畢后,再次向所述版本號(hào)服務(wù)器組獲取全局最大版本號(hào);
給所述事務(wù)分配一個(gè)比所述再次獲取到的全局最大版本號(hào)大的事務(wù)版本號(hào)。
本實(shí)施例中,再次向所述版本號(hào)服務(wù)器組獲取全局最大版本號(hào),與上述步驟110相同,此處不再贅述。
通過(guò)本實(shí)施例,在事務(wù)提交時(shí),通過(guò)獲取最新的全局最大版本號(hào),保證分配的事務(wù)版本號(hào)必然大于真正的全局最大版本號(hào)。
在本申請(qǐng)的又一個(gè)實(shí)施例中,版本號(hào)服務(wù)器在接收到數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求之后,還可以應(yīng)答數(shù)據(jù)庫(kù)服務(wù)器,從而通知所述數(shù)據(jù)庫(kù)服務(wù)器接收到了其更新請(qǐng)求。
具體地,在a1之后,還包括:
在接收數(shù)據(jù)庫(kù)服務(wù)器廣播的更新請(qǐng)求的情況下,向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示收到該更新請(qǐng)求。
具體地,在b1之后,還包括:
所述主版本號(hào)服務(wù)器接收所述數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求的情況下,向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
相對(duì)應(yīng)的,所述步驟150,具體可以包括:
在預(yù)設(shè)的第二等待時(shí)長(zhǎng)內(nèi),判斷返回的第二應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述第二應(yīng)答報(bào)文表示版本號(hào)服務(wù)器收到該更新請(qǐng)求。
若是,提交所述執(zhí)行完畢的事務(wù)。
本實(shí)施例中,所述第二等待時(shí)長(zhǎng)可以是人為設(shè)置的一個(gè)經(jīng)驗(yàn)值。值得一提的是,所述第二等待時(shí)長(zhǎng)還可以是與上述等待時(shí)長(zhǎng)相等。
通過(guò)本實(shí)施例,與原步驟150不同之處在于,數(shù)據(jù)庫(kù)服務(wù)器只有在取得了超過(guò)預(yù)設(shè)比例的版本號(hào)服務(wù)器應(yīng)答后,才可以提交事務(wù)。
在本申請(qǐng)的一個(gè)具體地實(shí)施例中,針對(duì)向所述版本號(hào)服務(wù)器組中主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的更新請(qǐng)求。
相應(yīng)地,所述步驟150,具體可以包括:
在接收到所述主版本號(hào)服務(wù)器返回第二應(yīng)答報(bào)文后,提交所述執(zhí)行完畢的事務(wù)。
通過(guò)本實(shí)施例,與原步驟150不同之處在于,數(shù)據(jù)庫(kù)服務(wù)器只有在取得了主版本號(hào)服務(wù)器應(yīng)答后,才可以提交事務(wù)。
以下結(jié)合圖5介紹本申請(qǐng)以分布式數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)服務(wù)器為主體的方法實(shí)施例,該實(shí)施例可以對(duì)應(yīng)圖1:
步驟210:針對(duì)待處理的事務(wù),向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;其中,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成;
步驟220:在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào);
步驟230:指定所獲取的全局最大版本號(hào)為所述待處理的事務(wù)的快照版本號(hào),從而執(zhí)行所述待處理的事務(wù)。
與上述步驟110相同的,所述步驟210,具體包括:
針對(duì)待處理的事務(wù),向版本號(hào)服務(wù)器組中的主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;
相對(duì)應(yīng)的,所述步驟220中基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào),具體包括:
獲取所述應(yīng)答報(bào)文中攜帶的全局最大版本號(hào)。
與上述步驟110相同的,所述步驟210,具體包括:
向版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的獲取請(qǐng)求;
相對(duì)應(yīng)的,所述步驟220中基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào),具體包括:
在預(yù)設(shè)的等待時(shí)長(zhǎng)內(nèi),判斷返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述應(yīng)答報(bào)文攜帶有版本號(hào)服務(wù)器的局部最大版本號(hào);
若是,將最大的局部最大版本號(hào)確定為全局最大版本號(hào)。
如圖5所示在所述步驟230之后,還可以包括步驟240、250和260,該實(shí)施例可以對(duì)應(yīng)圖1所述實(shí)施例中步驟140、141和150。
步驟240:在所述事務(wù)執(zhí)行完畢后,給所述事務(wù)分配一個(gè)比所述全局最大版本號(hào)大的事務(wù)版本號(hào);
步驟250:向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求;所述更新請(qǐng)求中攜帶有所述事務(wù)版本號(hào),并用于請(qǐng)求將全局最大版本號(hào)更新為所述事務(wù)版本號(hào);
步驟260:提交所述執(zhí)行完畢的事務(wù)。
與上述步驟140的一個(gè)具體地實(shí)施例相同的,所述240,具體可以包括:
在所述事務(wù)執(zhí)行完畢后,再次向所述版本號(hào)服務(wù)器組獲取全局最大版本號(hào);
給所述事務(wù)分配一個(gè)比所述再次獲取到的全局最大版本號(hào)大的事務(wù)版本號(hào)。
與上述步驟141的一個(gè)具體地實(shí)施例相同的,所述步驟250,具體包括:
向所述版本號(hào)服務(wù)器組中主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的更新請(qǐng)求。
而所述步驟260,具體包括:
在接收到所述主版本號(hào)服務(wù)器返回第二應(yīng)答報(bào)文后,提交所述執(zhí)行完畢的事務(wù);其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
與上述步驟141的一個(gè)具體地實(shí)施例相同的,所述步驟250,具體包括:
向所述版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的更新請(qǐng)求。
而所述步驟260,具體包括:
在預(yù)設(shè)的第二等待時(shí)長(zhǎng)內(nèi),判斷返回的第二應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述第二應(yīng)答報(bào)文表示版本號(hào)服務(wù)器收到該更新請(qǐng)求。
以下結(jié)合圖6介紹本申請(qǐng)以分布式數(shù)據(jù)庫(kù)的版本號(hào)服務(wù)器組為主體的方法實(shí)施例,該實(shí)施例可以對(duì)應(yīng)圖1:
步驟310:接收到數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的全局最大版本號(hào)的獲取請(qǐng)求。
步驟320:將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
具體地,所述步驟320,可以包括:
將主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
在另一個(gè)實(shí)施例中,所述將主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器,具體包括:
在主版本服務(wù)器不可用的情況下,從所述版本號(hào)服務(wù)器組中選取一個(gè)備用版本號(hào)服務(wù)器;
將所述備用版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
具體地,在步驟320之后,所述方法還包括:
c1:所述主版本號(hào)服務(wù)器接收所述數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
c2所述主版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的全局最大版本號(hào);
c3:若是,所述主版本號(hào)服務(wù)器將所述事務(wù)版本號(hào)確定為新的全局最大版本號(hào)。
所述c1-c3與前述b1-b3相同,此處不再贅述。
在c1之后,所述方法還包括:
所述主版本號(hào)服務(wù)器接收所述數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求的情況下,向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
具體地,所述步驟320,可以包括:
將所有版本號(hào)服務(wù)器維護(hù)的局部最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
具體地,在步驟320之后,所述方法還包括:
d1:各個(gè)版本號(hào)服務(wù)器接收數(shù)據(jù)庫(kù)服務(wù)器廣播的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
d2:各個(gè)版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的局部最大版本號(hào);
d3:若是,則將所述事務(wù)版本號(hào)確定為其新的局部最大版本號(hào)。
所述d1-d3與前述a1-a3相同,此處不再贅述。
在d1之后,所述方法還包括:
在接收到數(shù)據(jù)庫(kù)服務(wù)器廣播的更新請(qǐng)求的情況下,向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示收到該更新請(qǐng)求。
與前述事務(wù)處理方法實(shí)施例相對(duì)應(yīng),本申請(qǐng)還提供了一種事務(wù)處理裝置的實(shí)施例。
本申請(qǐng)事務(wù)處理裝置的實(shí)施例可以分別應(yīng)用在分布式數(shù)據(jù)庫(kù)。裝置實(shí)施例可以通過(guò)軟件實(shí)現(xiàn),也可以通過(guò)硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為一個(gè)邏輯意義上的裝置,是通過(guò)其所在設(shè)備的處理器將非易失性存儲(chǔ)器中對(duì)應(yīng)的計(jì)算機(jī)程序指令讀取到內(nèi)存中運(yùn)行形成的。從硬件層面而言,如圖7所示,為本申請(qǐng)事務(wù)處理裝置所在設(shè)備的一種硬件結(jié)構(gòu)圖,除了圖7所示的處理器、網(wǎng)絡(luò)接口、內(nèi)存以及非易失性存儲(chǔ)器之外,實(shí)施例中裝置所在的設(shè)備通常根據(jù)該事務(wù)處理的實(shí)際功能,還可以包括其他硬件,對(duì)此不再贅述。
參見(jiàn)圖8,為本申請(qǐng)一實(shí)施例提供的事務(wù)處理裝置的模塊圖,該實(shí)施例從分布式數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)服務(wù)器側(cè)進(jìn)行描述,所述裝置包括:發(fā)送單元410、獲取單元420和執(zhí)行單元430。
其中,發(fā)送單元410,針對(duì)待處理的事務(wù),向版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;其中,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成;
獲取單元420,在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,基于所述應(yīng)答報(bào)文獲取全局最大版本號(hào);
執(zhí)行單元430,指定所獲取的全局最大版本號(hào)為所述待處理的事務(wù)的快照版本號(hào),從而執(zhí)行所述待處理的事務(wù)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述發(fā)送單元410,具體包括:
發(fā)送子單元,向版本號(hào)服務(wù)器組中的主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的獲取請(qǐng)求;
相應(yīng)地,所述獲取單元420,具體包括:
獲取子單元,在接收到版本號(hào)服務(wù)器組返回的應(yīng)答報(bào)文后,獲取所述應(yīng)答報(bào)文中攜帶的全局最大版本號(hào)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述發(fā)送單元410,具體包括:
發(fā)送子單元,向版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的獲取請(qǐng)求;
相應(yīng)地,所述獲取單元420,具體包括:
判斷子單元,在預(yù)設(shè)的等待時(shí)長(zhǎng)內(nèi),判斷返回的應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述應(yīng)答報(bào)文攜帶有版本號(hào)服務(wù)器的局部最大版本號(hào);
確定子單元,在獲取到預(yù)設(shè)比例的版本號(hào)服務(wù)器返回的應(yīng)答報(bào)文的情況下,將最大的局部最大版本號(hào)確定為全局最大版本號(hào)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述裝置還包括:
分配單元,在所述事務(wù)執(zhí)行完畢后,給所述事務(wù)分配一個(gè)比所述全局最大版本號(hào)大的事務(wù)版本號(hào);
更新單元,向所述版本號(hào)服務(wù)器組發(fā)送全局最大版本號(hào)的更新請(qǐng)求;所述更新請(qǐng)求中攜帶有所述事務(wù)版本號(hào),并用于請(qǐng)求將全局最大版本號(hào)更新為所述事務(wù)版本號(hào);
提交單元,提交所述執(zhí)行完畢的事務(wù)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述分配單元,具體包括:
發(fā)送子單元,在所述事務(wù)執(zhí)行完畢后,再次向所述版本號(hào)服務(wù)器組獲取全局最大版本號(hào);
分配子單元,給所述事務(wù)分配一個(gè)比所述再次獲取到的全局最大版本號(hào)大的事務(wù)版本號(hào)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
更新單元,具體包括:
更新子單元,向所述版本號(hào)服務(wù)器組中主版本號(hào)服務(wù)器發(fā)送全局最大版本號(hào)的更新請(qǐng)求。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述提交單元,具體包括:
提交子單元,在接收到所述主版本號(hào)服務(wù)器返回第二應(yīng)答報(bào)文后,提交所述執(zhí)行完畢的事務(wù);其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
在一個(gè)可選的實(shí)現(xiàn)方式中:
更新單元,具體包括:
更新子單元,向所述版本號(hào)服務(wù)器組中所有版本號(hào)服務(wù)器廣播全局最大版本號(hào)的更新請(qǐng)求。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述提交單元,具體包括:
判斷子單元,在預(yù)設(shè)的第二等待時(shí)長(zhǎng)內(nèi),判斷返回的第二應(yīng)答報(bào)文數(shù)量與所有版本號(hào)服務(wù)器數(shù)量的比值是否到達(dá)預(yù)設(shè)比例;其中,所述第二應(yīng)答報(bào)文表示版本號(hào)服務(wù)器收到該更新請(qǐng)求。
提交子單元,在獲取到預(yù)設(shè)比例的版本號(hào)服務(wù)器返回的第二應(yīng)答報(bào)文的情況下,提交所述執(zhí)行完畢的事務(wù)。
參見(jiàn)圖9,為本申請(qǐng)一實(shí)施例提供的事務(wù)處理裝置的模塊圖,該實(shí)施例從分布式數(shù)據(jù)庫(kù)中的版本號(hào)服務(wù)器組側(cè)進(jìn)行描述,所述版本號(hào)服務(wù)器組由至少兩個(gè)用于維護(hù)全局最大版本號(hào)的數(shù)據(jù)庫(kù)服務(wù)器組成,所述裝置包括:接收單元510和返回單元520。
其中,接收單元510,接收到數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的全局最大版本號(hào)的獲取請(qǐng)求;
返回單元520,將維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述返回單元520,具體包括:
返回子單元,將主版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述返回子單元,具體包括:
選取子單元,在主版本服務(wù)器不可用的情況下,從所述版本號(hào)服務(wù)器組中選取一個(gè)備用版本號(hào)服務(wù)器;
第二返回子單元,將所述備用版本號(hào)服務(wù)器維護(hù)的全局最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述裝置還包括:
接收更新請(qǐng)求單元,所述主版本號(hào)服務(wù)器接收所述數(shù)據(jù)庫(kù)服務(wù)器發(fā)送的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
判斷單元,所述主版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的全局最大版本號(hào);
更新單元,在所述事務(wù)版本號(hào)大于其維護(hù)的全局最大版本號(hào)的情況下,所述主版本號(hào)服務(wù)器將所述事務(wù)版本號(hào)確定為新的全局最大版本號(hào)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
在所述更新單元之后,所述裝置還包括:
應(yīng)答單元,所述主版本號(hào)服務(wù)器向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示所述主版本號(hào)服務(wù)器收到該更新請(qǐng)求。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述返回單元,具體包括:
返回子單元,將所有版本號(hào)服務(wù)器維護(hù)的局部最大版本號(hào)返回給所述數(shù)據(jù)庫(kù)服務(wù)器。
在一個(gè)可選的實(shí)現(xiàn)方式中:
所述裝置還包括:
接收更新請(qǐng)求單元,各個(gè)版本號(hào)服務(wù)器接收數(shù)據(jù)庫(kù)服務(wù)器廣播的更新請(qǐng)求,該更新請(qǐng)求中攜帶有事務(wù)版本號(hào);
判斷單元,各個(gè)版本號(hào)服務(wù)器判斷所述事務(wù)版本號(hào)是否大于其維護(hù)的局部最大版本號(hào);
更新單元,在所述事務(wù)版本號(hào)大于其維護(hù)的全局最大版本號(hào)的情況下,將所述事務(wù)版本號(hào)確定為其新的局部最大版本號(hào)。
在一個(gè)可選的實(shí)現(xiàn)方式中:
在所述更新單元之后,所述裝置還包括:
應(yīng)答單元,在所述事務(wù)版本號(hào)大于或者不大于其維護(hù)的局部最大版本號(hào)的情況下,向所述數(shù)據(jù)庫(kù)服務(wù)器返回第二應(yīng)答報(bào)文;其中,所述第二應(yīng)答報(bào)文表示收到該更新請(qǐng)求。
上述實(shí)施例闡明的系統(tǒng)、裝置、模塊或單元,具體可以由計(jì)算機(jī)芯片或?qū)嶓w實(shí)現(xiàn),或者由具有某種功能的產(chǎn)品來(lái)實(shí)現(xiàn)。一種典型的實(shí)現(xiàn)設(shè)備為計(jì)算機(jī),計(jì)算機(jī)的具體形式可以是個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)、蜂窩電話、相機(jī)電話、智能電話、個(gè)人數(shù)字助理、媒體播放器、導(dǎo)航設(shè)備、電子郵件收發(fā)設(shè)備、游戲控制臺(tái)、平板計(jì)算機(jī)、可穿戴設(shè)備或者這些設(shè)備中的任意幾種設(shè)備的組合。
上述裝置中各個(gè)單元的功能和作用的實(shí)現(xiàn)過(guò)程具體詳見(jiàn)上述方法中對(duì)應(yīng)步驟的實(shí)現(xiàn)過(guò)程,在此不再贅述。
對(duì)于裝置實(shí)施例而言,由于其基本對(duì)應(yīng)于方法實(shí)施例,所以相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本申請(qǐng)方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。
本領(lǐng)域技術(shù)人員在考慮說(shuō)明書(shū)及實(shí)踐這里公開(kāi)的發(fā)明后,將容易想到本申請(qǐng)的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本申請(qǐng)的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請(qǐng)的一般性原理并包括本申請(qǐng)未公開(kāi)的本技術(shù)領(lǐng)域中的公知常識(shí)或慣用技術(shù)手段。說(shuō)明書(shū)和實(shí)施例僅被視為示例性的,本申請(qǐng)的真正范圍和精神由下面的權(quán)利要求指出。
應(yīng)當(dāng)理解的是,本申請(qǐng)并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本申請(qǐng)的范圍僅由所附的權(quán)利要求來(lái)限制。