一種處理分布式事務(wù)的方法與設(shè)備的制造方法
【專利摘要】本申請的目的是提供一種處理分布式事務(wù)的方法與設(shè)備。與現(xiàn)有技術(shù)相比,在分布式系統(tǒng)中,本申請的第一設(shè)備是由多個節(jié)點組成的一個組,所述第一設(shè)備獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,并基于所述加寫鎖請求,對所述目標表進行加寫鎖處理,從而避免多個事務(wù)并發(fā)時的沖突問題,確保事務(wù)的隔離性,若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息,以確保后續(xù)SQL編譯器對目標表的正確版本進行操作。進一步地,本申請通過重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,或?qū)⑺鲎庸?jié)點的服務(wù)遷移到其他物理機器上,而后更新所述子節(jié)點的加鎖狀態(tài)信息,從而進行有效的出錯恢復并保證組內(nèi)一致性。
【專利說明】
_種處理分布式事務(wù)的方法與設(shè)備
技術(shù)領(lǐng)域
[0001 ]本申請涉及計算機領(lǐng)域,尤其涉及一種處理分布式事務(wù)的技術(shù)。【背景技術(shù)】
[0002]數(shù)據(jù)庫中的事務(wù)是數(shù)據(jù)庫運行中的一個邏輯工作單位,作為單個邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會永久更新面向數(shù)據(jù)的資源。而一個邏輯工作單元要成為事務(wù),必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性;在多個事務(wù)并發(fā)時, 如何避免沖突問題,都是關(guān)乎系統(tǒng)穩(wěn)定性及用戶體驗的重要問題。
【發(fā)明內(nèi)容】
[0003]本申請的一個目的是提供一種處理分布式事務(wù)的方法與設(shè)備。
[0004]根據(jù)本申請的一個方面,提供了一種在第一設(shè)備端處理分布式事務(wù)的方法,其中, 該方法包括:
[0005]a獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其中,所述事務(wù)包括若干條SQL語句;
[0006]b基于所述加寫鎖請求,對所述目標表進行加寫鎖處理;
[0007]c若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。
[0008]進一步地,所述第一設(shè)備包括一個總節(jié)點及若干個子節(jié)點;其中,所述步驟b包括: 通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫鎖處理。
[0009]進一步地,所述方法還包括:若所述總節(jié)點在預定時間內(nèi)獲取大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則所述加寫鎖處理成功。
[0010]進一步地,所述加寫鎖處理成功還包括:將新的加鎖狀態(tài)信息寫入日志文件中;或所述總節(jié)點存儲新的加鎖狀態(tài)信息。
[0011]進一步地,所述方法還包括:重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述子節(jié)點從所述日志文件中讀取最新的所述加鎖狀態(tài)信息;或重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。
[0012]進一步地,所述重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點還包括:若所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟,則通過所述總節(jié)點將所述子節(jié)點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。
[0013]進一步地,所述步驟b包括:對所述目標表的部分進行加寫鎖處理;其中,所述方法還包括:向第二設(shè)備發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。
[0014]進一步地,所述對所述目標表的部分進行加寫鎖處理包括:若所述目標表的全表已被加寫鎖,則忽略對所述目標表的部分進行加寫鎖處理;否則,對所述目標表的部分進行加寫鎖處理。
[0015]進一步地,所述方法還包括:當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本進行合并處理。
[0016]進一步地,所述方法還包括:當獲取事務(wù)提交語句,設(shè)置新版本的所述目標表的狀態(tài)為有效,解鎖所述目標表;或當獲取事務(wù)回滾語句,設(shè)置新版本的所述目標表的狀態(tài)為無效,解鎖所述目標表。
[0017]進一步地,所述步驟a還包括:獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的源表的加讀鎖請求;其中,所述步驟b還包括:基于所述加讀鎖請求,對所述源表進行加讀鎖處理; 其中,所述步驟c還包括:若所述加讀鎖處理成功,向所述SQL編譯器發(fā)送所述源表的待處理版本信息;其中,所述方法還包括:當獲取事務(wù)提交語句或事務(wù)回滾語句,解鎖所述源表。根據(jù)本申請的另一個方面,還提供了一種在第二設(shè)備端處理分布式事務(wù)的方法,其中,該方法包括:
[0018]A獲取第一設(shè)備發(fā)送的關(guān)于目標表的部分加寫鎖的請求;
[0019]B根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。
[0020]進一步地,所述步驟B包括:根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,向所述第一設(shè)備查詢所述目標表的全表是否已被加寫鎖;若所述目標表的全表未被加寫鎖,對所述目標表的部分進行加寫鎖處理。
[0021]進一步地,所述第二設(shè)備包括一個總節(jié)點及若干個子節(jié)點;其中,所述步驟B包括: 通過所述總節(jié)點將所述關(guān)于目標表的部分加寫鎖的請求分發(fā)至若干個所述子節(jié)點,對所述目標表的部分進行加寫鎖處理。[〇〇22]根據(jù)本申請的又一個方面,還提供了一種用于處理分布式事務(wù)的第一設(shè)備,其中, 該設(shè)備包括:[〇〇23]第一裝置,用于獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求, 其中,所述事務(wù)包括若干條SQL語句;
[0024]第二裝置,用于基于所述加寫鎖請求,對所述目標表進行加寫鎖處理;[〇〇25]第三裝置,用于若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。
[0026]進一步地,所述設(shè)備包括一個總節(jié)點及若干個子節(jié)點;其中,所述第二裝置用于: 通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫鎖處理。
[0027]進一步地,所述設(shè)備還包括:第四裝置,用于若所述總節(jié)點在預定時間內(nèi)獲取大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則所述加寫鎖處理成功。[〇〇28]進一步地,所述加寫鎖處理成功還包括:將新的加鎖狀態(tài)信息寫入日志文件中;或所述總節(jié)點存儲新的加鎖狀態(tài)信息。
[0029]進一步地,所述設(shè)備還包括:第五裝置,用于重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述子節(jié)點從所述日志文件中讀取最新的所述加鎖狀態(tài)信息;或第六裝置,用于重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。
[0030]進一步地,所述重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點還包括:若所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟,則通過所述總節(jié)點將所述子節(jié)點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。[0031 ]進一步地,所述第二裝置用于:對所述目標表的部分進行加寫鎖處理;其中,所述設(shè)備還包括:第七裝置,用于向第二設(shè)備發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。
[0032]進一步地,所述對所述目標表的部分進行加寫鎖處理包括:若所述目標表的全表已被加寫鎖,則忽略對所述目標表的部分進行加寫鎖處理;否則,對所述目標表的部分進行加寫鎖處理。
[0033]進一步地,所述設(shè)備還包括:第八裝置,用于當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本進行合并處理。
[0034]進一步地,所述設(shè)備還包括:第九裝置,用于當獲取事務(wù)提交語句,設(shè)置新版本的所述目標表的狀態(tài)為有效,解鎖所述目標表;或第十裝置,用于當獲取事務(wù)回滾語句,設(shè)置新版本的所述目標表的狀態(tài)為無效,解鎖所述目標表。[〇〇35]進一步地,所述第一裝置還用于:獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的源表的加讀鎖請求;其中,所述第二裝置還用于:基于所述加讀鎖請求,對所述源表進行加讀鎖處理;其中,所述第三裝置還用于:若所述加讀鎖處理成功,向所述SQL編譯器發(fā)送所述源表的待處理版本信息;其中,所述設(shè)備還包括:第十一裝置,用于當獲取事務(wù)提交語句或事務(wù)回滾語句,解鎖所述源表。[〇〇36]根據(jù)本申請的再一個方面,還提供了一種用于處理分布式事務(wù)的第二設(shè)備,其中, 該設(shè)備包括:
[0037]第十二裝置,用于獲取第一設(shè)備發(fā)送的關(guān)于目標表的部分加寫鎖的請求;
[0038]第十三裝置,用于根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。
[0039]進一步地,所述第十三裝置用于:根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,向所述第一設(shè)備查詢所述目標表的全表是否已被加寫鎖;若所述目標表的全表未被加寫鎖,對所述目標表的部分進行加寫鎖處理。
[0040]進一步地,所述設(shè)備包括一個總節(jié)點及若干個子節(jié)點;其中,所述第十三裝置用于:通過所述總節(jié)點將所述關(guān)于目標表的部分加寫鎖的請求分發(fā)至若干個所述子節(jié)點,對所述目標表的部分進行加寫鎖處理。
[0041]根據(jù)本申請的另一個方面,還提供了一種處理分布式事務(wù)的系統(tǒng),其中,該系統(tǒng)包括如上所述的第一設(shè)備及如上所述的第二設(shè)備。
[0042]與現(xiàn)有技術(shù)相比,在分布式系統(tǒng)中,本申請的第一設(shè)備是由多個節(jié)點組成的一個組,所述第一設(shè)備獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,并基于所述加寫鎖請求,對所述目標表進行加寫鎖處理,從而避免多個事務(wù)并發(fā)時的沖突問題,確保事務(wù)的隔離性,若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息,以確保后續(xù)SQL編譯器對目標表的正確版本進行操作。進一步地,本申請通過重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,或?qū)⑺鲎庸?jié)點的服務(wù)迀移到其他物理機器上,而后更新所述子節(jié)點的加鎖狀態(tài)信息,從而進行有效的出錯恢復并保證組內(nèi)一致性。進一步地, 在數(shù)量小、并發(fā)度較高的場景下,本申請通過所述第一設(shè)備及所述第二設(shè)備組成的系統(tǒng)對所述事務(wù)的目標表進行加寫鎖處理,由所述第二設(shè)備對所述目標表的部分進行加寫鎖處理,從而提高系統(tǒng)的效率?!靖綀D說明】
[0043]通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:[〇〇44]圖1示出根據(jù)本申請一個實施例的一種第一設(shè)備的結(jié)構(gòu)圖;
[0045]圖2示出根據(jù)本申請一個方面的一種處理分布式事務(wù)的方法流程圖;
[0046]圖3示出根據(jù)本申請一個實施例的一種處理分布式事務(wù)的方法流程圖;[〇〇47]圖4示出根據(jù)本申請另一個實施例的一種處理分布式事務(wù)的方法流程圖;[〇〇48]圖5示出根據(jù)本申請另一個方面的一種用于處理分布式事務(wù)的第一設(shè)備示意圖;
[0049]圖6示出根據(jù)本申請一個實施例的一種用于處理分布式事務(wù)的第一設(shè)備示意圖;
[0050]圖7示出根據(jù)本申請另一個實施例的一種用于處理分布式事務(wù)的第一設(shè)備與第二設(shè)備的不意圖。
[0051]附圖中相同或相似的附圖標記代表相同或相似的部件?!揪唧w實施方式】
[0052]下面結(jié)合附圖對本申請作進一步詳細描述。[〇〇53]在本申請一個典型的配置中,終端、服務(wù)網(wǎng)絡(luò)的設(shè)備和可信方均包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
[0054]內(nèi)存可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計算機可讀介質(zhì)的示例。
[0055]計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。 計算機的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPR0M)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、 數(shù)字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。 [〇〇56]圖2示出根據(jù)本申請一個方面的一種用于處理分布式事務(wù)的方法流程圖。[〇〇57] 該方法包括步驟S101、步驟S102和步驟S103。具體地,在步驟S101中,所述第一設(shè)備1獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其中,所述事務(wù)包括若干條SQL語句;在步驟S102中,所述第一設(shè)備1基于所述加寫鎖請求,對所述目標表進行加寫鎖處理;在步驟S103中,所述第一設(shè)備1若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。
[0058]在此,所述第一設(shè)備1包括但不限于用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進行人機交互的移動電子產(chǎn)品,例如智能手機、平板電腦等,所述移動電子產(chǎn)品可以采用任意操作系統(tǒng),如android操作系統(tǒng)、1S操作系統(tǒng)等。其中,所述網(wǎng)絡(luò)設(shè)備包括一種能夠按照事先設(shè)定或存儲的指令,自動進行數(shù)值計算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。所述網(wǎng)絡(luò)設(shè)備其包括但不限于計算機、網(wǎng)絡(luò)主機、單個網(wǎng)絡(luò)服務(wù)器、多個網(wǎng)絡(luò)服務(wù)器集或多個服務(wù)器構(gòu)成的云;在此,云由基于云計算(Cloud Computing)的大量計算機或網(wǎng)絡(luò)服務(wù)器構(gòu)成,其中,云計算是分布式計算的一種,由一群松散耦合的計算機集組成的一個虛擬超級計算機。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(Ad Hoc網(wǎng)絡(luò))等。優(yōu)選地,第一設(shè)備1還可以是運行于所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序。當然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述第一設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的第一設(shè)備1如可適用于本申請,也應(yīng)包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。[〇〇59]在步驟S101中,所述第一設(shè)備1獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其中,所述事務(wù)包括若干條SQL語句。
[0060]在此,SQL語言(結(jié)構(gòu)化查詢語言)的組成部分包括了 DCL語言(數(shù)據(jù)庫控制語言)。 所述事務(wù)由DCL語句begin transact1n(開始事務(wù))開始,并由DCL語句commit(事務(wù)提交) 或rollback(事務(wù)回滾)結(jié)束。在所述事務(wù)起始與終點處的DCL語句之間,包括若干條CRUD (Create、Retrieve、Update、Delete幾個單詞的首字母簡寫,主要被用在描述軟件系統(tǒng)中數(shù)據(jù)庫或者持久層的基本操作功能)SQL語句。所述目標表指的是所述SQL語句將要對其進行寫操作的表。而且,在加鎖過程中,所述事務(wù)中每條SQL語句對應(yīng)的加寫鎖請求分別獨立進行。[〇〇61] 例如,首先由SQL編譯器對所獲取的SQL語句進行編譯,得到該SQL語句涉及的表與執(zhí)行計劃,然后SQL編譯器向所述第一設(shè)備1發(fā)送關(guān)于所述事務(wù)中所述SQL語句的目標表的加寫鎖請求,通過加鎖的方式避免多個事務(wù)并發(fā)時產(chǎn)生沖突的問題,確保事務(wù)的隔離性 (Isolat1n)〇[〇〇62]優(yōu)選地,在步驟S101中,所述第一設(shè)備1還獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的源表的加讀鎖請求。
[0063]在此,所述源表指的是所述SQL語句將要對其進行讀操作的表。在大多數(shù)應(yīng)用場景中,所述SQL語句既有目標表也有源表,SQL編譯器還需發(fā)送對所述SQL語句的源表的加讀鎖請求。而在部分應(yīng)用場景中,所述SQL語句只有目標表沒有源表,則SQL編譯器無需發(fā)送對所述SQL語句的源表的加讀鎖請求。
[0064]在步驟S102中,所述第一設(shè)備1基于所述加寫鎖請求,對所述目標表進行加寫鎖處理。[〇〇65]在此,對所述事務(wù)的SQL語句的目標表進行加寫鎖處理。已被加寫鎖的所述目標表,在寫鎖被釋放之前,其他事務(wù)無法對其進行寫操作。[〇〇66]優(yōu)選地,在步驟S102中,所述第一設(shè)備1還基于所述加讀鎖請求,對所述源表進行加讀鎖處理。[〇〇67]例如,若所述SQL語句既有目標表也有源表,還需基于所述加讀鎖請求,對所述源表進行加讀鎖處理。
[0068]優(yōu)選地,所述第一設(shè)備1包括一個總節(jié)點及若干個子節(jié)點;其中,在步驟S102中,所述第一設(shè)備1通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫鎖處理。[〇〇69] 例如,一個物理機器(例如服務(wù)器等)即為一個節(jié)點(node),參照圖1,所述第一設(shè)備1可以是由運行在多個物理機器上的程序組成的一個組(group);在組(group)內(nèi)將其中一個物理機器選為總節(jié)點,其余物理機器則為子節(jié)點。當獲取SQL編譯器發(fā)送的所述加寫鎖請求時,所述總節(jié)點負責將所述加寫鎖請求廣播給組內(nèi)的所有所述子節(jié)點,以對所述目標表進行加寫鎖處理。在優(yōu)選的實施例中,在數(shù)據(jù)量大、并發(fā)度不高的場景下,批量處理所述加寫鎖請求。
[0070]在步驟S103中,所述第一設(shè)備1若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。
[0071]例如,每條CRUD操作的結(jié)果都是該條CRUD操作的目標表的一個新的版本,由于經(jīng)過CRUD操作后,通常一個表會有多個版本。在此,當所述加寫鎖處理成功后,將所述目標表的待處理版本信息返回給SQL編譯器,以確保后續(xù)SQL編譯器對目標表的正確版本進行操作。[〇〇72] 優(yōu)選地,在步驟S103中,所述第一設(shè)備1若所述加讀鎖處理成功,向所述SQL編譯器發(fā)送所述源表的待處理版本信息。[〇〇73]例如,若所述SQL語句既有目標表也有源表,還需將所述源表的待處理版本信息返回給SQL編譯器,以確保后續(xù)SQL編譯器對源表的正確版本進行操作。
[0074]優(yōu)選地,所述方法還包括:所述第一設(shè)備1當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本進行合并處理。
[0075]例如,對所述目標表進行若干次CRUD操作后,也會相應(yīng)地產(chǎn)生若干個版本,隨著時間的推移,所述目標表的版本數(shù)量在不斷地增加。在優(yōu)選的實施例中,當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本進行合并處理,以得到一個新的版本,并清除之前的版本。
[0076]優(yōu)選地,所述方法還包括:所述第一設(shè)備1當獲取事務(wù)提交語句,設(shè)置新版本的所述目標表的狀態(tài)為有效,解鎖所述目標表;當獲取事務(wù)回滾語句,設(shè)置新版本的所述目標表的狀態(tài)為無效,解鎖所述目標表。
[0077]例如,當獲取DCL語句commit(事務(wù)提交),將所述事務(wù)對所述目標表的寫操作全部標記為有效,同時釋放所述事務(wù)占有的所有鎖,即解鎖了所述目標表;當獲取DCL語句 rollback(事務(wù)回滾),將所述事務(wù)對所述目標表的寫操作全部標記為無效,同時釋放所述事務(wù)占有的所有鎖,即解鎖了所述目標表。從而確保事務(wù)的原子性(Atomicity)與一致性 (Consistency)〇
[0078]優(yōu)選地,所述方法還包括:所述第一設(shè)備1當獲取事務(wù)提交語句或事務(wù)回滾語句, 解鎖所述源表。
[0079]例如,當獲取commit語句或rollback語句,會釋放所述事務(wù)占有的所有鎖,既釋放了所述目標表的寫鎖,也釋放了所述源表的讀鎖。
[0080]圖3示出根據(jù)本申請一個實施例的一種用于處理分布式事務(wù)的方法流程圖。[0081 ] 該方法包括步驟S101’、步驟S102’、步驟S104’和步驟S103’。在此,所述步驟S101’、步驟S103’與圖1中步驟S101、步驟S103內(nèi)容相同或基本相同,為簡明起見,不再贅述。
[0082]具體地,在步驟S102’中,所述第一設(shè)備1基于所述加寫鎖請求,通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫鎖處理;在步驟S104’ 中,所述第一設(shè)備1若所述總節(jié)點在預定時間內(nèi)獲取大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則所述加寫鎖處理成功。
[0083]例如,所述總節(jié)點負責將所述加寫鎖請求廣播給組內(nèi)的所有所述子節(jié)點并等待所述子節(jié)點對所述加寫鎖請求的響應(yīng),只有當收到大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),所述加寫鎖處理才算成功。如果所述總節(jié)點在預定時間內(nèi)沒能收到足夠多的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則加鎖失敗;此時,所述總節(jié)點可以有兩種選擇:一種是隨機等待一段時間后繼續(xù)發(fā)送所述加寫鎖請求,直到到達加鎖嘗試次數(shù)的閾值,如果此時仍未加鎖成功則返回加鎖失敗信息;另一種是直接返回加鎖失敗信息。SQL 編譯器在收到加鎖失敗信息后,需要重試,即重新發(fā)送所述加寫鎖請求。
[0084]優(yōu)選地,所述加寫鎖處理成功還包括:將新的加鎖狀態(tài)信息寫入日志文件中;或所述總節(jié)點存儲新的加鎖狀態(tài)信息。
[0085]例如,若得到大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則所述加寫鎖處理成功,并保存新的加鎖狀態(tài)信息。在此,有兩種保存新的加鎖狀態(tài)信息的方式,一種是將新的加鎖狀態(tài)信息寫入日志文件中,另一種是所述總節(jié)點存儲新的加鎖狀態(tài)fg息。
[0086]優(yōu)選地,所述方法還包括:所述第一設(shè)備1重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述子節(jié)點從所述日志文件中讀取最新的所述加鎖狀態(tài)信息;或重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。
[0087]例如,接上例,若所述子節(jié)點未響應(yīng)(可能由于物理機器死機等原因所致)所述加寫鎖請求,需重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,而且該子節(jié)點在重啟后需要更新自己的狀態(tài)信息,以便與組內(nèi)的其他成員(包括所述總節(jié)點及所述子節(jié)點)保持一致。在此, 所述子節(jié)點也有兩種更新狀態(tài)信息的方式,一種是所述子節(jié)點從所述日志文件中讀取最新的所述加鎖狀態(tài)信息,另一種是所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。在另外的實施例中,若所述總節(jié)點無法響應(yīng),則從組內(nèi)的其余所述子節(jié)點中重新選出新的總節(jié)點。
[0088]更優(yōu)選地,所述重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點還包括:若所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟,則通過所述總節(jié)點將所述子節(jié)點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。
[0089]例如,接上例,還可能存在所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟的情況,此時,可通過所述總節(jié)點將所述子節(jié)點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。而后,該物理機器上的所述子節(jié)點可通過上述兩種方式更新自己的狀態(tài)信息,以便與組內(nèi)的其他成員(包括所述總節(jié)點及所述子節(jié)點)保持一致。與現(xiàn)有技術(shù)相比,本申請通過重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,或?qū)⑺鲎庸?jié)點的服務(wù)迀移到其他物理機器上,而后更新所述子節(jié)點的加鎖狀態(tài)信息,從而進行有效的出錯恢復并保證組內(nèi)一致性。
[0090]圖4示出根據(jù)本申請另一個實施例的一種用于處理分布式事務(wù)的方法流程圖。
[0091] 該方法包括步驟S101”、步驟S102”、步驟S107”和步驟S103”,步驟S212”和步驟 S213”。在此,所述步驟S101”、步驟S103”與圖1中步驟S101、步驟S103內(nèi)容相同或基本相同, 為簡明起見,不再贅述。
[0092]具體地,在步驟S102”中,所述第一設(shè)備1基于所述加寫鎖請求,對所述目標表的部分進行加寫鎖處理;在步驟S107”中,所述第一設(shè)備1向第二設(shè)備2發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。
[0093]例如,在數(shù)量小、并發(fā)度較高的場景下,SQL編譯器可進一步細化鎖的粒度,針對所述目標表中的某一部分向所述第一設(shè)備1發(fā)送加寫鎖請求。在此,所述第一設(shè)備1響應(yīng)以表為單位的所述加寫鎖請求,并轉(zhuǎn)發(fā)以表中某部分為單位的所述加寫鎖請求。具體地,向所述第二設(shè)備2發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。[〇〇94]優(yōu)選地,所述對所述目標表的部分進行加寫鎖處理包括:若所述目標表的全表已被加寫鎖,則忽略對所述目標表的部分進行加寫鎖處理;否則,對所述目標表的部分進行加寫鎖處理。[〇〇95]在此,若所述目標表的全表已被所述第一設(shè)備1加寫鎖,當前事務(wù)已經(jīng)獲取了所述目標表的全表的寫鎖,沒必要再獲取所述目標表的部分的寫鎖,所以此時無需對所述目標表的部分進行加寫鎖處理。[〇〇96]在步驟S212”中,所述第二設(shè)備2獲取第一設(shè)備1發(fā)送的關(guān)于目標表的部分加寫鎖的請求;在步驟S213”中,所述第二設(shè)備2根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。
[0097]在此,所述第二設(shè)備2根據(jù)所述第一設(shè)備1發(fā)送的關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。
[0098]優(yōu)選地,所述第二設(shè)備2包括一個總節(jié)點及若干個子節(jié)點;其中,在步驟S213”中, 所述第二設(shè)備2通過所述總節(jié)點將所述關(guān)于目標表的部分加寫鎖的請求分發(fā)至若干個所述子節(jié)點,對所述目標表的部分進行加寫鎖處理。[〇〇99] 例如,所述第二設(shè)備2也可以是由運行在多個物理機器上的程序組成的一個組 (group);在組(group)內(nèi)將其中一個物理機器選為總節(jié)點,其余物理機器則為子節(jié)點。當獲取所述第一設(shè)備1發(fā)送的關(guān)于目標表的部分加寫鎖的請求時,所述總節(jié)點負責將所述關(guān)于目標表的部分加寫鎖的請求廣播給組內(nèi)的所有所述子節(jié)點,以對所述目標表的部分進行加寫鎖處理。
[0100]優(yōu)選地,在步驟S213”中,所述第二設(shè)備2根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,向所述第一設(shè)備查詢所述目標表的全表是否已被加寫鎖;若所述目標表的全表未被加寫鎖,對所述目標表的部分進行加寫鎖處理。
[0101]例如,所述第二設(shè)備2獲取所述關(guān)于目標表的部分加寫鎖的請求后,可向所述第一設(shè)備1查詢所述目標表的全表是否已被加寫鎖;若所述目標表的全表已被所述第一設(shè)備1加寫鎖,則無需再對所述目標表的部分進行加寫鎖處理。
[0102]圖5示出根據(jù)本申請另一個方面的一種用于處理分布式事務(wù)的第一設(shè)備1,其中, 第一設(shè)備1包括第一裝置101、第二裝置102和第三裝置103。[〇1〇3]具體地,所述第一裝置101獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其中,所述事務(wù)包括若干條SQL語句;所述第二裝置102基于所述加寫鎖請求,對所述目標表進行加寫鎖處理;所述第三裝置103若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。
[0104]在此,所述第一設(shè)備1包括但不限于用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進行人機交互的移動電子產(chǎn)品,例如智能手機、平板電腦等,所述移動電子產(chǎn)品可以采用任意操作系統(tǒng),如android操作系統(tǒng)、1S操作系統(tǒng)等。其中,所述網(wǎng)絡(luò)設(shè)備包括一種能夠按照事先設(shè)定或存儲的指令,自動進行數(shù)值計算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(ASIC)、可編程門陣列(FPGA)、數(shù)字處理器(DSP)、嵌入式設(shè)備等。所述網(wǎng)絡(luò)設(shè)備其包括但不限于計算機、網(wǎng)絡(luò)主機、單個網(wǎng)絡(luò)服務(wù)器、多個網(wǎng)絡(luò)服務(wù)器集或多個服務(wù)器構(gòu)成的云;在此,云由基于云計算(Cloud Computing)的大量計算機或網(wǎng)絡(luò)服務(wù)器構(gòu)成,其中,云計算是分布式計算的一種,由一群松散耦合的計算機集組成的一個虛擬超級計算機。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(Ad Hoc網(wǎng)絡(luò))等。優(yōu)選地,第一設(shè)備1還可以是運行于所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序。當然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述第一設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的第一設(shè)備1如可適用于本申請,也應(yīng)包含在本申請保護范圍以內(nèi),并在此以引用方式包含于此。
[0105]所述第一裝置101獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其中,所述事務(wù)包括若干條SQL語句。
[0106]在此,SQL語言(結(jié)構(gòu)化查詢語言)的組成部分包括了 DCL語言(數(shù)據(jù)庫控制語言)。 所述事務(wù)由DCL語句begin transact1n(開始事務(wù))開始,并由DCL語句commit(事務(wù)提交) 或rollback(事務(wù)回滾)結(jié)束。在所述事務(wù)起始與終點處的DCL語句之間,包括若干條CRUD (Create、Retrieve、Update、Delete幾個單詞的首字母簡寫,主要被用在描述軟件系統(tǒng)中數(shù)據(jù)庫或者持久層的基本操作功能)SQL語句。所述目標表指的是所述SQL語句將要對其進行寫操作的表。而且,在加鎖過程中,所述事務(wù)中每條SQL語句對應(yīng)的加寫鎖請求分別獨立進行。[〇1〇7] 例如,首先由SQL編譯器對所獲取的SQL語句進行編譯,得到該SQL語句涉及的表與執(zhí)行計劃,然后SQL編譯器向所述第一設(shè)備1發(fā)送關(guān)于所述事務(wù)中所述SQL語句的目標表的加寫鎖請求,通過加鎖的方式避免多個事務(wù)并發(fā)時產(chǎn)生沖突的問題,確保事務(wù)的隔離性 (Isolat1n)〇
[0108]優(yōu)選地,所述第一裝置101還獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的源表的加讀鎖請求。
[0109]在此,所述源表指的是所述SQL語句將要對其進行讀操作的表。在大多數(shù)應(yīng)用場景中,所述SQL語句既有目標表也有源表,SQL編譯器還需發(fā)送對所述SQL語句的源表的加讀鎖請求。而在部分應(yīng)用場景中,所述SQL語句只有目標表沒有源表,則SQL編譯器無需發(fā)送對所述SQL語句的源表的加讀鎖請求。[〇11〇]所述第二裝置102基于所述加寫鎖請求,對所述目標表進行加寫鎖處理。在此,對所述事務(wù)的SQL語句的目標表進行加寫鎖處理。已被加寫鎖的所述目標表,在寫鎖被釋放之前,其他事務(wù)無法對其進行寫操作。
[0112]優(yōu)選地,所述第二裝置102還基于所述加讀鎖請求,對所述源表進行加讀鎖處理。
[0113]例如,若所述SQL語句既有目標表也有源表,還需基于所述加讀鎖請求,對所述源表進行加讀鎖處理。
[0114]優(yōu)選地,所述第一設(shè)備1包括一個總節(jié)點及若干個子節(jié)點;其中,所述第二裝置102 通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫鎖處理。
[0115]例如,一個物理機器(例如服務(wù)器等)即為一個節(jié)點(node),參照圖1,所述第一設(shè)備1可以是由運行在多個物理機器上的程序組成的一個組(group);在組(group)內(nèi)將其中一個物理機器選為總節(jié)點,其余物理機器則為子節(jié)點。當獲取SQL編譯器發(fā)送的所述加寫鎖請求時,所述總節(jié)點負責將所述加寫鎖請求廣播給組內(nèi)的所有所述子節(jié)點,以對所述目標表進行加寫鎖處理。在優(yōu)選的實施例中,在數(shù)據(jù)量大、并發(fā)度不高的場景下,批量處理所述加寫鎖請求。
[0116]所述第三裝置103若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。
[0117]例如,每條CRUD操作的結(jié)果都是該條CRUD操作的目標表的一個新的版本,由于經(jīng)過CRUD操作后,通常一個表會有多個版本。在此,當所述加寫鎖處理成功后,將所述目標表的待處理版本信息返回給SQL編譯器,以確保后續(xù)SQL編譯器對目標表的正確版本進行操作。
[0118]優(yōu)選地,所述第三裝置103若所述加讀鎖處理成功,向所述SQL編譯器發(fā)送所述源表的待處理版本信息。[〇119]例如,若所述SQL語句既有目標表也有源表,還需將所述源表的待處理版本信息返回給SQL編譯器,以確保后續(xù)SQL編譯器對源表的正確版本進行操作。[〇12〇]優(yōu)選地,所述第一設(shè)備1還包括第八裝置(圖中未示出);所述第八裝置當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本進行合并處理。 [0121 ]例如,對所述目標表進行若干次CRUD操作后,也會相應(yīng)地產(chǎn)生若干個版本,隨著時間的推移,所述目標表的版本數(shù)量在不斷地增加。在優(yōu)選的實施例中,當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本進行合并處理,以得到一個新的版本,并清除之前的版本。
[0122]優(yōu)選地,所述第一設(shè)備1還包括第九裝置(圖中未示出)或第十裝置(圖中未示出); 所述第九裝置當獲取事務(wù)提交語句,設(shè)置新版本的所述目標表的狀態(tài)為有效,解鎖所述目標表;所述第十裝置當獲取事務(wù)回滾語句,設(shè)置新版本的所述目標表的狀態(tài)為無效,解鎖所述目標表。
[0123]例如,當獲取DCL語句commit(事務(wù)提交),將所述事務(wù)對所述目標表的寫操作全部標記為有效,同時釋放所述事務(wù)占有的所有鎖,即解鎖了所述目標表;當獲取DCL語句 rollback(事務(wù)回滾),將所述事務(wù)對所述目標表的寫操作全部標記為無效,同時釋放所述事務(wù)占有的所有鎖,即解鎖了所述目標表。從而確保事務(wù)的原子性(Atomicity)與一致性 (Consistency)〇
[0124]優(yōu)選地,所述第一設(shè)備1還包括第十一裝置(圖中未示出);所述第十一裝置當獲取事務(wù)提交語句或事務(wù)回滾語句,解鎖所述源表。[〇125] 例如,當獲取commit語句或rollback語句,會釋放所述事務(wù)占有的所有鎖,既釋放了所述目標表的寫鎖,也釋放了所述源表的讀鎖。
[0126]圖6示出根據(jù)本申請一個實施例的一種用于處理分布式事務(wù)的第一設(shè)備1,其中, 第一設(shè)備1包括第一裝置101’、第二裝置102’、第四裝置104’和第三裝置103’。
[0127]在此,所述第一裝置101’、第三裝置103’與圖4中第一裝置101、第三裝置103內(nèi)容相同或基本相同,為簡明起見,不再贅述。
[0128]具體地,所述第二裝置102’基于所述加寫鎖請求,通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫鎖處理;所述第四裝置104’若所述總節(jié)點在預定時間內(nèi)獲取大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng), 則所述加寫鎖處理成功。
[0129]例如,所述總節(jié)點負責將所述加寫鎖請求廣播給組內(nèi)的所有所述子節(jié)點并等待所述子節(jié)點對所述加寫鎖請求的響應(yīng),只有當收到大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),所述加寫鎖處理才算成功。如果所述總節(jié)點在預定時間內(nèi)沒能收到足夠多的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則加鎖失敗;此時,所述總節(jié)點可以有兩種選擇:一種是隨機等待一段時間后繼續(xù)發(fā)送所述加寫鎖請求,直到到達加鎖嘗試次數(shù)的閾值,如果此時仍未加鎖成功則返回加鎖失敗信息;另一種是直接返回加鎖失敗信息。SQL 編譯器在收到加鎖失敗信息后,需要重試,即重新發(fā)送所述加寫鎖請求。
[0130]優(yōu)選地,所述加寫鎖處理成功還包括:將新的加鎖狀態(tài)信息寫入日志文件中;或所述總節(jié)點存儲新的加鎖狀態(tài)信息。
[0131]例如,若得到大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖請求的響應(yīng),則所述加寫鎖處理成功,并保存新的加鎖狀態(tài)信息。在此,有兩種保存新的加鎖狀態(tài)信息的方式,一種是將新的加鎖狀態(tài)信息寫入日志文件中,另一種是所述總節(jié)點存儲新的加鎖狀態(tài)fg息。
[0132]優(yōu)選地,所述第一設(shè)備1還包括第五裝置(圖中未示出)和第六裝置(圖中未示出); 所述第五裝置重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述子節(jié)點從所述日志文件中讀取最新的所述加鎖狀態(tài)信息;或所述第六裝置重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點, 所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。
[0133]例如,接上例,若所述子節(jié)點未響應(yīng)(可能由于物理機器死機等原因所致)所述加寫鎖請求,需重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,而且該子節(jié)點在重啟后需要更新自己的狀態(tài)信息,以便與組內(nèi)的其他成員(包括所述總節(jié)點及所述子節(jié)點)保持一致。在此, 所述子節(jié)點也有兩種更新狀態(tài)信息的方式,一種是所述子節(jié)點從所述日志文件中讀取最新的所述加鎖狀態(tài)信息,另一種是所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。在另外的實施例中,若所述總節(jié)點無法響應(yīng),則從組內(nèi)的其余所述子節(jié)點中重新選出新的總節(jié)點。
[0134]更優(yōu)選地,所述重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點還包括:若所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟,則通過所述總節(jié)點將所述子節(jié)點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。
[0135]例如,接上例,還可能存在所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟的情況,此時,可通過所述總節(jié)點將所述子節(jié)點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。而后,該物理機器上的所述子節(jié)點可通過上述兩種方式更新自己的狀態(tài)信息,以便與組內(nèi)的其他成員(包括所述總節(jié)點及所述子節(jié)點)保持一致。與現(xiàn)有技術(shù)相比,本申請通過重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,或?qū)⑺鲎庸?jié)點的服務(wù)迀移到其他物理機器上,而后更新所述子節(jié)點的加鎖狀態(tài)信息,從而進行有效的出錯恢復并保證組內(nèi)一致性。
[0136]圖7示出根據(jù)本申請另一個實施例的一種用于處理分布式事務(wù)的第一設(shè)備1與第二設(shè)備2,其中,第一設(shè)備1包括第一裝置101”、第二裝置102”、第七裝置107”和第三裝置 103”,第二設(shè)備2包括第十二裝置212”和第十三裝置213”。
[0137]在此,所述第一裝置101”、第三裝置103”與圖4中第一裝置101、第三裝置103內(nèi)容相同或基本相同,為簡明起見,不再贅述。
[0138]具體地,所述第二裝置102”基于所述加寫鎖請求,對所述目標表的部分進行加寫鎖處理;所述第七裝置107”向第二設(shè)備發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。
[0139]例如,在數(shù)量小、并發(fā)度較高的場景下,SQL編譯器可進一步細化鎖的粒度,針對所述目標表中的某一部分向所述第一設(shè)備1發(fā)送加寫鎖請求。在此,所述第一設(shè)備1響應(yīng)以表為單位的所述加寫鎖請求,并轉(zhuǎn)發(fā)以表中某部分為單位的所述加寫鎖請求。具體地,向所述第二設(shè)備2發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。[〇14〇]優(yōu)選地,所述對所述目標表的部分進行加寫鎖處理包括:若所述目標表的全表已被加寫鎖,則忽略對所述目標表的部分進行加寫鎖處理;否則,對所述目標表的部分進行加寫鎖處理。[〇141]在此,若所述目標表的全表已被所述第一設(shè)備1加寫鎖,當前事務(wù)已經(jīng)獲取了所述目標表的全表的寫鎖,沒必要再獲取所述目標表的部分的寫鎖,所以此時無需對所述目標表的部分進行加寫鎖處理。
[0142]所述第十二裝置212”獲取第一設(shè)備1發(fā)送的關(guān)于目標表的部分加寫鎖的請求;所述第十三裝置213”根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。
[0143]在此,所述第二設(shè)備2根據(jù)所述第一設(shè)備1發(fā)送的關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。
[0144]優(yōu)選地,所述第二設(shè)備2包括一個總節(jié)點及若干個子節(jié)點;其中,所述第十三裝置 213”通過所述總節(jié)點將所述關(guān)于目標表的部分加寫鎖的請求分發(fā)至若干個所述子節(jié)點,對所述目標表的部分進行加寫鎖處理。
[0145]例如,所述第二設(shè)備2也可以是由運行在多個物理機器上的程序組成的一個組 (group);在組(group)內(nèi)將其中一個物理機器選為總節(jié)點,其余物理機器則為子節(jié)點。當獲取所述第一設(shè)備1發(fā)送的關(guān)于目標表的部分加寫鎖的請求時,所述總節(jié)點負責將所述關(guān)于目標表的部分加寫鎖的請求廣播給組內(nèi)的所有所述子節(jié)點,以對所述目標表的部分進行加寫鎖處理。
[0146]優(yōu)選地,所述第十三裝置213”根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,向所述第一設(shè)備查詢所述目標表的全表是否已被加寫鎖;若所述目標表的全表未被加寫鎖,對所述目標表的部分進行加寫鎖處理。
[0147]例如,所述第二設(shè)備2獲取所述關(guān)于目標表的部分加寫鎖的請求后,可向所述第一設(shè)備1查詢所述目標表的全表是否已被加寫鎖;若所述目標表的全表已被所述第一設(shè)備1加寫鎖,則無需再對所述目標表的部分進行加寫鎖處理。
[0148]優(yōu)選地,本申請還提供了一種處理事務(wù)的系統(tǒng),其中,該系統(tǒng)包括如上所述的第一設(shè)備1及如上所述的第二設(shè)備2。
[0149]例如,在數(shù)量小、并發(fā)度較高的場景下,通過所述第一設(shè)備1及所述第二設(shè)備2組成的系統(tǒng)對所述事務(wù)的目標表進行加寫鎖處理;其中,所述第一設(shè)備1響應(yīng)以表為單位的加寫鎖請求,并向所述第二設(shè)備2轉(zhuǎn)發(fā)以表中某部分為單位的加寫鎖請求,由所述第二設(shè)備2對所述目標表的部分進行加寫鎖處理。
[0150]與現(xiàn)有技術(shù)相比,在分布式系統(tǒng)中,本申請的第一設(shè)備是由多個節(jié)點組成的一個組,所述第一設(shè)備獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,并基于所述加寫鎖請求,對所述目標表進行加寫鎖處理,從而避免多個事務(wù)并發(fā)時的沖突問題,確保事務(wù)的隔離性,若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息,以確保后續(xù)SQL編譯器對目標表的正確版本進行操作。進一步地,本申請通過重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,或?qū)⑺鲎庸?jié)點的服務(wù)迀移到其他物理機器上,而后更新所述子節(jié)點的加鎖狀態(tài)信息,從而進行有效的出錯恢復并保證組內(nèi)一致性。進一步地, 在數(shù)量小、并發(fā)度較高的場景下,本申請通過所述第一設(shè)備及所述第二設(shè)備組成的系統(tǒng)對所述事務(wù)的目標表進行加寫鎖處理,由所述第二設(shè)備對所述目標表的部分進行加寫鎖處理,從而提尚系統(tǒng)的效率。[0151 ]需要注意的是,本申請可在軟件和/或軟件與硬件的組合體中被實施,例如,可采用專用集成電路(ASIC)、通用目的計算機或任何其他類似硬件設(shè)備來實現(xiàn)。在一個實施例中,本申請的軟件程序可以通過處理器執(zhí)行以實現(xiàn)上文所述步驟或功能。同樣地,本申請的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲到計算機可讀記錄介質(zhì)中,例如,RAM存儲器, 磁或光驅(qū)動器或軟磁盤及類似設(shè)備。另外,本申請的一些步驟或功能可采用硬件來實現(xiàn),例如,作為與處理器配合從而執(zhí)行各個步驟或功能的電路。
[0152]另外,本申請的一部分可被應(yīng)用為計算機程序產(chǎn)品,例如計算機程序指令,當其被計算機執(zhí)行時,通過該計算機的操作,可以調(diào)用或提供根據(jù)本申請的方法和/或技術(shù)方案。 而調(diào)用本申請的方法的程序指令,可能被存儲在固定的或可移動的記錄介質(zhì)中,和/或通過廣播或其他信號承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲在根據(jù)所述程序指令運行的計算機設(shè)備的工作存儲器中。在此,根據(jù)本申請的一個實施例包括一個裝置,該裝置包括用于存儲計算機程序指令的存儲器和用于執(zhí)行程序指令的處理器,其中,當該計算機程序指令被該處理器執(zhí)行時,觸發(fā)該裝置運行基于前述根據(jù)本申請的多個實施例的方法和/或技術(shù)方案。
[0153]對于本領(lǐng)域技術(shù)人員而言,顯然本申請不限于上述示范性實施例的細節(jié),而且在不背離本申請的精神或基本特征的情況下,能夠以其他的具體形式實現(xiàn)本申請。因此,無論從哪一點來看,均應(yīng)將實施例看作是示范性的,而且是非限制性的,本申請的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本申請內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標記視為限制所涉及的權(quán)利要求。此夕卜,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復數(shù)。裝置權(quán)利要求中陳述的多個單元或裝置也可以由一個單元或裝置通過軟件或者硬件來實現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定的順序。
【主權(quán)項】
1.一種在第一設(shè)備端處理分布式事務(wù)的方法,其中,該方法包括:a獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其中,所述事務(wù)包 括若干條SQL語句;b基于所述加寫鎖請求,對所述目標表進行加寫鎖處理; c若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版本信息。2.根據(jù)權(quán)利要求1所述的方法,其中,所述第一設(shè)備包括一個總節(jié)點及若干個子節(jié)點; 其中,所述步驟b包括:通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫 鎖處理。3.根據(jù)權(quán)利要求2所述的方法,其中,所述方法還包括:若所述總節(jié)點在預定時間內(nèi)獲取大于或等于預定數(shù)量的所述子節(jié)點關(guān)于所述加寫鎖 請求的響應(yīng),則所述加寫鎖處理成功。4.根據(jù)權(quán)利要求3所述的方法,其中,所述加寫鎖處理成功還包括:將新的加鎖狀態(tài)信息寫入日志文件中;或所述總節(jié)點存儲新的加鎖狀態(tài)信息。5.根據(jù)權(quán)利要求4所述的方法,其中,所述方法還包括:重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述子節(jié)點從所述日志文件中讀取最新的 所述加鎖狀態(tài)信息;或重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述總節(jié)點將最新的所述加鎖狀態(tài)信息發(fā) 送至所述子節(jié)點。6.根據(jù)權(quán)利要求5所述的方法,其中,所述重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點還 包括:若所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟,則通過所述總節(jié)點將所述子節(jié) 點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。7.根據(jù)權(quán)利要求1所述的方法,其中,所述步驟b包括:對所述目標表的部分進行加寫鎖處理;其中,所述方法還包括:向第二設(shè)備發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。8.根據(jù)權(quán)利要求7所述的方法,其中,所述對所述目標表的部分進行加寫鎖處理包括: 若所述目標表的全表已被加寫鎖,則忽略對所述目標表的部分進行加寫鎖處理;否則,對所述目標表的部分進行加寫鎖處理。9.根據(jù)權(quán)利要求1所述的方法,其中,所述方法還包括:當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標表的若干個版本 進行合并處理。10.根據(jù)權(quán)利要求1所述的方法,其中,所述方法還包括:當獲取事務(wù)提交語句,設(shè)置新版本的所述目標表的狀態(tài)為有效,解鎖所述目標表;或 當獲取事務(wù)回滾語句,設(shè)置新版本的所述目標表的狀態(tài)為無效,解鎖所述目標表。11.根據(jù)權(quán)利要求1所述的方法,其中,所述步驟a還包括:獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的源表的加讀鎖請求;其中,所述步驟b還包括:基于所述加讀鎖請求,對所述源表進行加讀鎖處理;其中,所述步驟c還包括:若所述加讀鎖處理成功,向所述SQL編譯器發(fā)送所述源表的待處理版本信息;其中,所述方法還包括:當獲取事務(wù)提交語句或事務(wù)回滾語句,解鎖所述源表。12.—種在第二設(shè)備端處理分布式事務(wù)的方法,其中,該方法包括:A獲取第一設(shè)備發(fā)送的關(guān)于目標表的部分加寫鎖的請求;B根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進行加寫鎖處理。13.根據(jù)權(quán)利要求12所述的方法,其中,所述步驟B包括:根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,向所述第一設(shè)備查詢所述目標表的全表是 否已被加寫鎖;若所述目標表的全表未被加寫鎖,對所述目標表的部分進行加寫鎖處理。14.根據(jù)權(quán)利要求12所述的方法,其中,所述第二設(shè)備包括一個總節(jié)點及若干個子節(jié)占.其中,所述步驟B包括:通過所述總節(jié)點將所述關(guān)于目標表的部分加寫鎖的請求分發(fā)至若干個所述子節(jié)點,對 所述目標表的部分進行加寫鎖處理。15.—種用于處理分布式事務(wù)的第一設(shè)備,其中,該設(shè)備包括:第一裝置,用于獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的目標表的加寫鎖請求,其 中,所述事務(wù)包括若干條SQL語句;第二裝置,用于基于所述加寫鎖請求,對所述目標表進行加寫鎖處理;第三裝置,用于若所述加寫鎖處理成功,向所述SQL編譯器發(fā)送所述目標表的待處理版 本信息。16.根據(jù)權(quán)利要求15所述的設(shè)備,其中,所述設(shè)備包括一個總節(jié)點及若干個子節(jié)點;其中,所述第二裝置用于:通過所述總節(jié)點將所述加寫鎖請求分發(fā)至若干個所述子節(jié)點,對所述目標表進行加寫 鎖處理。17.根據(jù)權(quán)利要求16所述的設(shè)備,其中,所述設(shè)備還包括:第四裝置,用于若所述總節(jié)點在預定時間內(nèi)獲取大于或等于預定數(shù)量的所述子節(jié)點關(guān) 于所述加寫鎖請求的響應(yīng),則所述加寫鎖處理成功。18.根據(jù)權(quán)利要求17所述的設(shè)備,其中,所述加寫鎖處理成功還包括:將新的加鎖狀態(tài)信息寫入日志文件中;或所述總節(jié)點存儲新的加鎖狀態(tài)信息。19.根據(jù)權(quán)利要求18所述的設(shè)備,其中,所述設(shè)備還包括:第五裝置,用于重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述子節(jié)點從所述日志文 件中讀取最新的所述加鎖狀態(tài)信息;或第六裝置,用于重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點,所述總節(jié)點將最新的所述 加鎖狀態(tài)信息發(fā)送至所述子節(jié)點。20.根據(jù)權(quán)利要求19所述的設(shè)備,其中,所述重啟未響應(yīng)所述加寫鎖請求的所述子節(jié)點 還包括:若所述未響應(yīng)所述加寫鎖請求的所述子節(jié)點無法重啟,則通過所述總節(jié)點將所述子節(jié) 點的服務(wù)迀移到其他物理機器上,并在該物理機器上啟動所述子節(jié)點的服務(wù)。21.根據(jù)權(quán)利要求15所述的設(shè)備,其中,所述第二裝置用于:對所述目標表的部分進行加寫鎖處理;其中,所述設(shè)備還包括:第七裝置,用于向第二設(shè)備發(fā)送關(guān)于所述目標表的部分加寫鎖的請求。22.根據(jù)權(quán)利要求21所述的設(shè)備,其中,所述對所述目標表的部分進行加寫鎖處理包 括:若所述目標表的全表已被加寫鎖,則忽略對所述目標表的部分進行加寫鎖處理;否則, 對所述目標表的部分進行加寫鎖處理。23.根據(jù)權(quán)利要求15所述的設(shè)備,其中,所述設(shè)備還包括:第八裝置,用于當所述目標表的版本數(shù)量等于或大于預定版本數(shù)量閾值,對所述目標 表的若干個版本進行合并處理。24.根據(jù)權(quán)利要求15所述的設(shè)備,其中,所述設(shè)備還包括:第九裝置,用于當獲取事務(wù)提交語句,設(shè)置新版本的所述目標表的狀態(tài)為有效,解鎖所 述目標表;或第十裝置,用于當獲取事務(wù)回滾語句,設(shè)置新版本的所述目標表的狀態(tài)為無效,解鎖所 述目標表。25.根據(jù)權(quán)利要求15所述的設(shè)備,其中,所述第一裝置還用于:獲取SQL編譯器發(fā)送的關(guān)于待處理的事務(wù)的源表的加讀鎖請求;其中,所述第二裝置還用于:基于所述加讀鎖請求,對所述源表進行加讀鎖處理;其中,所述第三裝置還用于:若所述加讀鎖處理成功,向所述SQL編譯器發(fā)送所述源表的待處理版本信息;其中,所述設(shè)備還包括:第十一裝置,用于當獲取事務(wù)提交語句或事務(wù)回滾語句,解鎖所述源表。26.—種用于處理分布式事務(wù)的第二設(shè)備,其中,該設(shè)備包括:第十二裝置,用于獲取第一設(shè)備發(fā)送的關(guān)于目標表的部分加寫鎖的請求;第十三裝置,用于根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,對所述目標表的部分進 行加寫鎖處理。27.根據(jù)權(quán)利要求26所述的設(shè)備,其中,所述第十三裝置用于:根據(jù)所述關(guān)于目標表的部分加寫鎖的請求,向所述第一設(shè)備查詢所述目標表的全表是 否已被加寫鎖;若所述目標表的全表未被加寫鎖,對所述目標表的部分進行加寫鎖處理。28.根據(jù)權(quán)利要求26所述的設(shè)備,其中,所述設(shè)備包括一個總節(jié)點及若干個子節(jié)點;其中,所述第十三裝置用于:通過所述總節(jié)點將所述關(guān)于目標表的部分加寫鎖的請求分發(fā)至若干個所述子節(jié)點,對所述目標表的部分進行加寫鎖處理。29.—種處理分布式事務(wù)的系統(tǒng),其中,該系統(tǒng)包括如權(quán)利要求21或22所述的第一設(shè)備 及如權(quán)利要求26至28中任一項所述的第二設(shè)備。
【文檔編號】G06F9/46GK105955804SQ201610254762
【公開日】2016年9月21日
【申請日】2016年4月22日
【發(fā)明人】徐飛, 劉汪根, 代克, 康毅
【申請人】星環(huán)信息科技(上海)有限公司