本申請(qǐng)涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫(kù)操作方法及裝置。
背景技術(shù):
數(shù)據(jù)庫(kù)事務(wù)(Database Transaction),是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完全地執(zhí)行,要么完全地不執(zhí)行。一個(gè)事務(wù)由一系列數(shù)據(jù)庫(kù)操作指令構(gòu)成,例如語(yǔ)句。
在數(shù)據(jù)庫(kù)操作中,為了保證并發(fā)讀取數(shù)據(jù)的正確性,提出了事務(wù)隔離級(jí)別的概念。在標(biāo)準(zhǔn)結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language,SQL)規(guī)范中,定義了4個(gè)事務(wù)隔離級(jí)別,其中,讀已提交(Read Committed)是多數(shù)應(yīng)用程序優(yōu)選考慮的隔離級(jí)別,它可以避免臟讀取,而且具有較好的并發(fā)性能,但仍會(huì)遇到不可重復(fù)讀的問(wèn)題。
對(duì)于讀已提交隔離級(jí)別事務(wù)面臨的不可重復(fù)讀問(wèn)題,可以通過(guò)for update語(yǔ)句臨時(shí)性的提升讀已提交隔離級(jí)別事務(wù)中某個(gè)數(shù)據(jù)的隔離級(jí)別,以保證該數(shù)據(jù)可重復(fù)讀取,但這會(huì)嚴(yán)重降低系統(tǒng)的并發(fā)性能,導(dǎo)致執(zhí)行效率較低,事務(wù)吞吐量較低。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)的多個(gè)方面提供一種數(shù)據(jù)庫(kù)操作方法及裝置,用以保證數(shù)據(jù)庫(kù)系統(tǒng)的并發(fā)性能,提高事務(wù)執(zhí)行效率并增大事務(wù)吞吐量。
本申請(qǐng)的一方面,提供一種數(shù)據(jù)庫(kù)操作方法,包括:
在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取所述應(yīng)用服務(wù)器執(zhí)行到的所述目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令;
對(duì)所述數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給所述應(yīng)用服務(wù)器以供所述應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄所述數(shù)據(jù)庫(kù)操作指令以及在所述數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一時(shí)記錄所述預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù);
當(dāng)獲取到所述目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的所述數(shù)據(jù)庫(kù)操作指令以及所述預(yù)測(cè)執(zhí)行數(shù)據(jù),控制所述應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行所述目標(biāo)事務(wù)。
本申請(qǐng)的另一方面,提供一種數(shù)據(jù)庫(kù)操作方法,包括:
在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取所述應(yīng)用服務(wù)器執(zhí)行到的所述目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令;
對(duì)所述數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給所述應(yīng)用服務(wù)器以供所述應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄所述數(shù)據(jù)庫(kù)操作指令以及在所述數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí)記錄所述預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù);
當(dāng)獲取到所述目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的所述數(shù)據(jù)庫(kù)操作指令以及所述預(yù)測(cè)執(zhí)行數(shù)據(jù),控制所述應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行所述目標(biāo)事務(wù)。
本申請(qǐng)的又一方面,提供一種數(shù)據(jù)庫(kù)操作裝置,包括:
獲取模塊,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取所述應(yīng)用服務(wù)器執(zhí)行到的所述目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令;
預(yù)測(cè)執(zhí)行模塊,用于對(duì)所述數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給所述應(yīng)用服務(wù)器以供所述應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄所述數(shù)據(jù)庫(kù)操作指令以及在所述數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一時(shí)記錄所述預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù);
控制執(zhí)行模塊,用于當(dāng)獲取到所述目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本 地記錄的所述數(shù)據(jù)庫(kù)操作指令以及所述預(yù)測(cè)執(zhí)行數(shù)據(jù),控制所述應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行所述目標(biāo)事務(wù)。
本申請(qǐng)的又一方面,提供一種數(shù)據(jù)庫(kù)操作裝置,包括:
獲取模塊,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取所述應(yīng)用服務(wù)器執(zhí)行到的所述目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令;
預(yù)測(cè)執(zhí)行模塊,用于對(duì)所述數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給所述應(yīng)用服務(wù)器以供所述應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄所述數(shù)據(jù)庫(kù)操作指令以及在所述數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí)記錄所述預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù);
控制執(zhí)行模塊,用于當(dāng)獲取到所述目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的所述數(shù)據(jù)庫(kù)操作指令以及所述預(yù)測(cè)執(zhí)行數(shù)據(jù),控制所述應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行所述目標(biāo)事務(wù)。
在本申請(qǐng)中,數(shù)據(jù)庫(kù)操作裝置與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程加入預(yù)測(cè)執(zhí)行過(guò)程,預(yù)先獲得并記錄目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,并僅針對(duì)屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,或者僅針對(duì)屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),以適應(yīng)于讀已提交隔離級(jí)別下的加鎖方案,為真實(shí)執(zhí)行事務(wù)提供了條件,之后根據(jù)記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行該目標(biāo)事務(wù),有利于提高執(zhí)行效率,進(jìn)而增大事務(wù)吞吐量。
【附圖說(shuō)明】
為了更清楚地說(shuō)明本申請(qǐng)實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本申請(qǐng)的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為現(xiàn)有技術(shù)中數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的部署圖;
圖2為本申請(qǐng)一實(shí)施例提供的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的部署圖;
圖3為本申請(qǐng)另一實(shí)施例提供的數(shù)據(jù)庫(kù)操作方法的流程示意圖;
圖4為本申請(qǐng)又一實(shí)施例提供的數(shù)據(jù)庫(kù)操作方法的流程示意圖;
圖5為本申請(qǐng)又一實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置的結(jié)構(gòu)示意圖;
圖6為本申請(qǐng)又一實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
為使本申請(qǐng)實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本申請(qǐng)保護(hù)的范圍。
圖1為現(xiàn)有技術(shù)中數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的部署圖。如圖1所示,該系統(tǒng)包括:應(yīng)用服務(wù)器10和數(shù)據(jù)庫(kù)20。其中,應(yīng)用服務(wù)器10可以為一個(gè),也可以為多個(gè)。數(shù)據(jù)庫(kù)20可以為一個(gè),也可以為多個(gè)。圖1中僅示例性的示出一個(gè)應(yīng)用服務(wù)器10和一個(gè)數(shù)據(jù)庫(kù)20。當(dāng)需要以事務(wù)方式對(duì)數(shù)據(jù)庫(kù)20進(jìn)行訪問(wèn)時(shí),應(yīng)用服務(wù)器10執(zhí)行事務(wù)邏輯,依次將事務(wù)中的數(shù)據(jù)庫(kù)操作指令作用于數(shù)據(jù)庫(kù)20上。由于無(wú)法預(yù)先獲知事務(wù)中需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,導(dǎo)致事務(wù)執(zhí)行效率較低,尤其是在配置讀已提交隔離級(jí)別下通過(guò)for update語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行加鎖的方案中,其執(zhí)行效率會(huì)更低,事務(wù)吞吐量較低。
針對(duì)現(xiàn)有技術(shù)存在的缺陷,本申請(qǐng)?zhí)峁┮环N新的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),如圖2所示。該系統(tǒng)在應(yīng)用服務(wù)器10和數(shù)據(jù)庫(kù)20之間增加數(shù)據(jù)庫(kù)操作裝置30。數(shù)據(jù)庫(kù)操作裝置30用以執(zhí)行本申請(qǐng)?zhí)峁┑臄?shù)據(jù)庫(kù)操作方法,在讀已提交這一隔離級(jí)別下的加鎖方案中實(shí)現(xiàn)一種新的事務(wù)執(zhí)行邏輯,即先對(duì)事務(wù)進(jìn)行預(yù)測(cè)執(zhí)行,提前獲得該事務(wù)中需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,實(shí)現(xiàn)執(zhí)行路徑的預(yù)測(cè),并且結(jié)合 讀已提交這一隔離級(jí)別且加鎖的情況,僅僅針對(duì)屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,或者僅僅針對(duì)屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令記錄對(duì)其進(jìn)行預(yù)測(cè)執(zhí)行所產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),進(jìn)而基于預(yù)測(cè)執(zhí)行得到的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)在數(shù)據(jù)庫(kù)20上實(shí)際執(zhí)行事務(wù),有利于提高事務(wù)執(zhí)行效率,增大事務(wù)吞吐量。事務(wù)吞吐量是指單位時(shí)間內(nèi)處理事務(wù)的數(shù)量。
值得說(shuō)明的是,數(shù)據(jù)庫(kù)操作裝置30實(shí)際上是一種邏輯處理裝置,其可以單獨(dú)部署,位于應(yīng)用服務(wù)器10和數(shù)據(jù)庫(kù)20之間,也可以部署于應(yīng)用服務(wù)器10一端實(shí)現(xiàn),或者也可以部署于數(shù)據(jù)庫(kù)20一端實(shí)現(xiàn)。
下面實(shí)施例將具體說(shuō)明本申請(qǐng)技術(shù)方案的方法流程。
圖3為本申請(qǐng)另一實(shí)施例提供的數(shù)據(jù)庫(kù)操作方法的流程示意圖。如圖3所示,該方法包括:
301、在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令。
302、對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄數(shù)據(jù)庫(kù)操作指令以及在數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一時(shí)記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。
303、當(dāng)獲取到目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
首先說(shuō)明,為便于描述,本實(shí)施例將應(yīng)用服務(wù)器需要執(zhí)行的事務(wù)稱為目標(biāo)事務(wù)。目標(biāo)事務(wù)主要包括用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的操作指令,除數(shù)據(jù)庫(kù)操作指令之外還包括一些用于控制目標(biāo)事務(wù)執(zhí)行狀態(tài)的控制指令,例如事務(wù)開(kāi)始指令、事務(wù)提交指令、事務(wù)回滾指令等。這些指令實(shí)際上是由數(shù)據(jù)庫(kù)語(yǔ)言編寫的語(yǔ)句。根據(jù)數(shù)據(jù)庫(kù)語(yǔ)言的不同,這些指令可以是不同語(yǔ)言編寫的語(yǔ)句。舉例說(shuō)明,若采用SQL,則上述數(shù)據(jù)庫(kù)操作指令和控制指令實(shí)際上是一系列的SQL語(yǔ)句。
另外,在一些應(yīng)用場(chǎng)景中,事務(wù)的處理需要先選中一些記錄,再對(duì)這些記 錄進(jìn)行處理,因此需要對(duì)選擇的記錄加排他鎖。這意味著,本實(shí)施例中的數(shù)據(jù)庫(kù)操作指令可能是加鎖的數(shù)據(jù)庫(kù)操作指令。例如,假設(shè)從Bob的賬戶里轉(zhuǎn)出100元,這個(gè)操作由三步完成,查詢Bob的賬戶,判斷該賬戶是否夠100元,將Bob的賬戶里的錢減少100塊。如果有兩個(gè)轉(zhuǎn)賬操作并行進(jìn)行,當(dāng)?shù)谝粋€(gè)轉(zhuǎn)賬操作查出Bob的賬戶的余額,發(fā)現(xiàn)有100塊,如果這時(shí)候有另外一個(gè)轉(zhuǎn)賬操作也去查了Bob的賬戶,也發(fā)現(xiàn)Bob的賬戶里有100塊,于是這兩個(gè)轉(zhuǎn)賬操作都會(huì)進(jìn)行轉(zhuǎn)賬,于是,第一個(gè)操作從Bob的賬戶減去100塊錢,另一個(gè)操作也從Bob的賬戶減去100塊錢,這時(shí)候,Bob的賬戶余額就可能是負(fù)數(shù)。為了避免這種情況,需要使用for update來(lái)對(duì)Bob的賬戶加鎖,保證在第一個(gè)轉(zhuǎn)賬操作進(jìn)行過(guò)程中,第二個(gè)轉(zhuǎn)賬操作無(wú)法獲得這個(gè)鎖,也就無(wú)法進(jìn)行查詢。
本實(shí)施例提供的方法適用于對(duì)隔離級(jí)別為讀已提交的數(shù)據(jù)庫(kù)進(jìn)行操作。其中,有些數(shù)據(jù)庫(kù)默認(rèn)是讀已提交這一隔離級(jí)別,例如,Oracle數(shù)據(jù)庫(kù)默認(rèn)是讀已提交這一隔離級(jí)別的,有些數(shù)據(jù)庫(kù)默認(rèn)不是讀已提交這一隔離級(jí)別,例如MySQL數(shù)據(jù)庫(kù)默認(rèn)是可重復(fù)讀這一隔離級(jí)別。基于此,在執(zhí)行本實(shí)施例提供的方法之前,可以確定數(shù)據(jù)庫(kù)的隔離級(jí)別是否是讀已提交,若不是,則需要預(yù)先配置數(shù)據(jù)庫(kù)為讀已提交這一隔離級(jí)別。例如,可以在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)之前,配置數(shù)據(jù)庫(kù)為讀已提交這一隔離級(jí)別。
在數(shù)據(jù)庫(kù)的隔離級(jí)別為讀已提交的前提下,可以執(zhí)行本實(shí)施例提供的方法以在數(shù)據(jù)庫(kù)中執(zhí)行目標(biāo)事務(wù)。具體流程如下:
應(yīng)用服務(wù)器控制整個(gè)目標(biāo)事務(wù)的執(zhí)行邏輯,可以按照現(xiàn)有方式執(zhí)行目標(biāo)事務(wù)。數(shù)據(jù)庫(kù)操作裝置在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令。
在一可選實(shí)施方式中,應(yīng)用服務(wù)器按照現(xiàn)有方式向數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)庫(kù)操作指令,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。數(shù)據(jù)庫(kù)操作裝置可以對(duì)應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的通信進(jìn)行監(jiān)控,以攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)操作指令。
在另一可選實(shí)施方式中,對(duì)應(yīng)用服務(wù)器的處理邏輯進(jìn)行稍微修改,將原來(lái)向數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)庫(kù)操作指令的處理邏輯改為向數(shù)據(jù)庫(kù)操作裝置發(fā)送?;诖?, 數(shù)據(jù)庫(kù)操作裝置可以接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的數(shù)據(jù)庫(kù)操作指令。
在此說(shuō)明,若目標(biāo)事務(wù)是顯式事務(wù),則目標(biāo)事務(wù)中的首個(gè)指令是事務(wù)開(kāi)始指令,如開(kāi)始事務(wù)(begin transaction),基于此,數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令之前,可以攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的目標(biāo)事務(wù)中的事務(wù)開(kāi)始指令,根據(jù)該事務(wù)開(kāi)始指令,獲知需要執(zhí)行目標(biāo)事務(wù)?;蛘?,數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令之前,可以接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的目標(biāo)事務(wù)中的事務(wù)開(kāi)始指令,根據(jù)該事務(wù)開(kāi)始指令,獲知需要執(zhí)行目標(biāo)事務(wù)。若目標(biāo)事務(wù)是隱式事務(wù),則目標(biāo)事務(wù)的首個(gè)指令就是數(shù)據(jù)庫(kù)操作指令,不包括獲取事務(wù)開(kāi)始指令的步驟。
數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令后,對(duì)獲取到的數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器,以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令。其中,預(yù)測(cè)執(zhí)行結(jié)果決定著目標(biāo)事務(wù)的執(zhí)行路徑,這里的執(zhí)行路徑是指數(shù)據(jù)庫(kù)操作指令之間的跳轉(zhuǎn)邏輯。通過(guò)將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器,從而達(dá)到由應(yīng)用服務(wù)器控制整個(gè)目標(biāo)事務(wù)的執(zhí)行邏輯的目的。
另外,數(shù)據(jù)庫(kù)操作裝置還需要在本地記錄所獲取到的數(shù)據(jù)庫(kù)操作指令,以及在該數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一時(shí),記錄對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。所述修改數(shù)據(jù)庫(kù)類指令是指對(duì)數(shù)據(jù)庫(kù)有修改的數(shù)據(jù)庫(kù)操作指令,例如以u(píng)pdate、insert等開(kāi)頭的指令;一般以select開(kāi)頭的指令不屬于修改數(shù)據(jù)庫(kù)類指令(稱為非修改數(shù)據(jù)庫(kù)類指令)。雖然從本質(zhì)而言,讀已提交隔離級(jí)別只保證寫入多個(gè)數(shù)據(jù)是原子的,不在讀取的時(shí)候加鎖,但為了保證事務(wù)的一致性,降低回滾概率,有些非修改數(shù)據(jù)庫(kù)類指令可能需要通過(guò)for update語(yǔ)句進(jìn)行加鎖,例如在上面轉(zhuǎn)賬舉例中,select指令需要加鎖,形成select……for update形式的數(shù)據(jù)庫(kù)操作指令,這種指令可稱為被加鎖的非修改數(shù)據(jù)庫(kù)類指令。所述預(yù)測(cè)執(zhí)行數(shù)據(jù)主要是指對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行過(guò)程中的一些數(shù)據(jù),例如數(shù)據(jù)庫(kù)操作指令所操作的數(shù)據(jù)以及數(shù)據(jù)的主鍵ID和主鍵ID對(duì)應(yīng)的版本號(hào)信息(version) 等。
值得說(shuō)明的是,對(duì)于同一數(shù)據(jù)庫(kù)操作指令來(lái)說(shuō),要么屬于修改數(shù)據(jù)庫(kù)類指令,要么屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令,要么屬于未加鎖的非修改數(shù)據(jù)庫(kù)類指令。但是,從整個(gè)目標(biāo)事務(wù)來(lái)看,對(duì)于該目標(biāo)事務(wù)中所有修改數(shù)據(jù)庫(kù)類指令以及所有被加鎖的非修改數(shù)據(jù)庫(kù)類指令預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)都會(huì)被記錄在本地。
例如,數(shù)據(jù)庫(kù)操作裝置可以在本地創(chuàng)建內(nèi)存庫(kù),將所獲取到的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)存入內(nèi)存庫(kù)中。進(jìn)一步,若預(yù)測(cè)執(zhí)行數(shù)據(jù)不包括預(yù)測(cè)執(zhí)行結(jié)果,則也可以將預(yù)測(cè)執(zhí)行結(jié)果存入內(nèi)存庫(kù)中。
為了在預(yù)測(cè)執(zhí)行這一核心思想的基礎(chǔ)上實(shí)現(xiàn)對(duì)讀已提交這一隔離級(jí)別下的加鎖方案的模擬,本實(shí)施例針對(duì)屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一的數(shù)據(jù)庫(kù)操作指令,記錄其預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),卻不記錄屬于未被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令對(duì)應(yīng)的預(yù)測(cè)執(zhí)行數(shù)據(jù)。由此可見(jiàn),在實(shí)現(xiàn)讀已提交這一隔離級(jí)別下的加鎖方案的情況下,所記錄的數(shù)據(jù)量相對(duì)較少,這樣在后續(xù)基于本地記錄的數(shù)據(jù)庫(kù)操作指令和預(yù)測(cè)執(zhí)行數(shù)據(jù)在數(shù)據(jù)庫(kù)中真實(shí)執(zhí)行目標(biāo)事務(wù)的過(guò)程中,所需處理的數(shù)據(jù)量相對(duì)較少,有利于進(jìn)一步提高執(zhí)行效率和性能,增大事務(wù)吞吐量。
其中,數(shù)據(jù)庫(kù)操作指令對(duì)數(shù)據(jù)庫(kù)的操作主要是訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),則可以模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于所模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行。進(jìn)一步,考慮到屬于非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令不會(huì)引起數(shù)據(jù)庫(kù)的變化,因此可以直接在數(shù)據(jù)庫(kù)中對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,這樣可以節(jié)約模擬數(shù)據(jù)環(huán)境的操作,實(shí)現(xiàn)相對(duì)簡(jiǎn)單,有利于節(jié)約資源,提高執(zhí)行效率。但是,對(duì)于屬于修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,由于其會(huì)引起數(shù)據(jù)庫(kù)的變化(主要是指數(shù)據(jù)庫(kù)中的數(shù)據(jù)被改變),因此需要模擬數(shù)據(jù)環(huán)境,在所模擬的數(shù)據(jù)環(huán)境中進(jìn)行預(yù)測(cè)執(zhí)行。
基于上述分析,一種對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行的方式可以是:
對(duì)獲取到的數(shù)據(jù)庫(kù)操作指令的類別進(jìn)行識(shí)別;
若數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令,則在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于所模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行;
若數(shù)據(jù)庫(kù)操作指令屬于非修改數(shù)據(jù)庫(kù)類指令,在數(shù)據(jù)庫(kù)中執(zhí)行該數(shù)據(jù)庫(kù)操作指令,以對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行。
進(jìn)一步,一種在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于所模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行的實(shí)施方式包括:
將獲取到的數(shù)據(jù)庫(kù)操作指令拆分為一個(gè)讀指令和一個(gè)寫指令,將讀指令運(yùn)行于真正的數(shù)據(jù)庫(kù)上,即在數(shù)據(jù)庫(kù)中執(zhí)行該讀指令以獲取讀數(shù)據(jù)集(ReadSet),將讀數(shù)據(jù)集存入本地內(nèi)存庫(kù)中,以模擬數(shù)據(jù)庫(kù)操作指令所需的數(shù)據(jù)環(huán)境。然后,將寫指令作用于內(nèi)存庫(kù)上,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作指令的預(yù)測(cè)執(zhí)行,即在內(nèi)存庫(kù)中執(zhí)行寫指令以修改讀數(shù)據(jù)集,例如對(duì)讀數(shù)據(jù)集中的有關(guān)數(shù)據(jù)進(jìn)行更新或查詢處理等。其中,執(zhí)行寫指令以修改讀數(shù)據(jù)集可以產(chǎn)生結(jié)果數(shù)據(jù)集(affectRowInMemdb),該結(jié)果數(shù)據(jù)集包括預(yù)測(cè)執(zhí)行結(jié)果。
在上述預(yù)測(cè)執(zhí)行過(guò)程中,若數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令,則數(shù)據(jù)庫(kù)操作裝置可以在本地記錄讀指令所讀取的讀數(shù)據(jù)集以及執(zhí)行寫指令產(chǎn)生的結(jié)果數(shù)據(jù)集。由此可見(jiàn),所述預(yù)測(cè)執(zhí)行數(shù)據(jù)可以包括讀數(shù)據(jù)集和結(jié)果數(shù)據(jù)集,或者也可以包括讀數(shù)據(jù)集和結(jié)果數(shù)據(jù)集中的部分?jǐn)?shù)據(jù),例如能夠?qū)υ跀?shù)據(jù)庫(kù)中實(shí)際執(zhí)行目標(biāo)事務(wù)產(chǎn)生有益效果的一些數(shù)據(jù),例如一些數(shù)值的各種索引,例如一級(jí)索引、二級(jí)索引、主鍵ID、版本號(hào)等。
較優(yōu)的,為了進(jìn)一步減少記錄的數(shù)據(jù)量,在數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí),可以僅記錄該數(shù)據(jù)庫(kù)操作指令所操作的數(shù)據(jù)的主鍵ID和版本號(hào)作為預(yù)測(cè)執(zhí)行數(shù)據(jù)。這樣在后續(xù)基于本地記錄的數(shù)據(jù)庫(kù)操作指令和預(yù)測(cè)執(zhí)行數(shù)據(jù)在數(shù)據(jù)庫(kù)中真實(shí)執(zhí)行目標(biāo)事務(wù)的過(guò)程中,所需處理的數(shù)據(jù)量會(huì)進(jìn)一步較少,有利于進(jìn)一步提高執(zhí)行效率和性能,增大事務(wù)吞吐量。另外,有時(shí)數(shù)據(jù)在事務(wù)過(guò)程中可能會(huì)經(jīng)過(guò)多次修改,但最終又回到初始值,但數(shù)據(jù)的主鍵ID和版本號(hào)不會(huì)發(fā)生變化。因此,若采用記錄數(shù)據(jù)本身的方式,在預(yù)測(cè)執(zhí)行與真 實(shí)執(zhí)行進(jìn)行比較時(shí)數(shù)據(jù)可能不一樣,就要發(fā)生回滾,而回滾的代價(jià)較大。但是,本實(shí)施例采用只記錄數(shù)據(jù)的主鍵ID和版本號(hào)的方式,在預(yù)測(cè)執(zhí)行與真實(shí)執(zhí)行進(jìn)行比較時(shí)出現(xiàn)不一致的概率較低,回滾概率較低。
當(dāng)數(shù)據(jù)庫(kù)操作裝置獲取到目標(biāo)事務(wù)中的事務(wù)提交指令(即應(yīng)用服務(wù)器執(zhí)行到事務(wù)提交指令)時(shí),則可以根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
上述根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)的一種可選實(shí)施方式包括:
數(shù)據(jù)庫(kù)操作裝置向數(shù)據(jù)庫(kù)下發(fā)本地記錄的所述數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)操作指令,并接收數(shù)據(jù)庫(kù)返回的數(shù)據(jù)庫(kù)操作指令的實(shí)際執(zhí)行結(jié)果;然后,將數(shù)據(jù)庫(kù)操作指令的實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果進(jìn)行比較,若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)提交指令,以供數(shù)據(jù)庫(kù)提交該目標(biāo)事務(wù);若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果不相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)回滾指令,以供數(shù)據(jù)庫(kù)回滾該目標(biāo)事務(wù)。
在上述實(shí)施方式中,考慮到事務(wù)的原子性,通過(guò)將實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果進(jìn)行比較,可以避免事務(wù)執(zhí)行過(guò)程出錯(cuò),有利于提高事務(wù)執(zhí)行的成功概率。
進(jìn)一步,在現(xiàn)有技術(shù)中,由于無(wú)法預(yù)先知道事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,所以只能按照事務(wù)的執(zhí)行邏輯依次執(zhí)行數(shù)據(jù)庫(kù)操作指令,這會(huì)導(dǎo)致應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的頻繁交互,這在遠(yuǎn)程應(yīng)用場(chǎng)景中將會(huì)消耗大量網(wǎng)絡(luò)資源。但在本實(shí)施例中,通過(guò)預(yù)測(cè)執(zhí)行過(guò)程已經(jīng)預(yù)先獲得目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,即本地記錄的數(shù)據(jù)庫(kù)操作指令,因此在向數(shù)據(jù)庫(kù)下發(fā)本地記錄的數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)操作指令的過(guò)程中,可以將本地記錄的數(shù)據(jù)庫(kù)操作指令同時(shí)(或者一并)下發(fā)到數(shù)據(jù)庫(kù),有利于節(jié)約網(wǎng)絡(luò)資源。另外,對(duì)于一些并行的數(shù)據(jù)庫(kù)操作指令,數(shù)據(jù)庫(kù)還可以并行操作,有利于進(jìn)一步提高事務(wù)執(zhí)行效率,增大事務(wù)吞吐量。
進(jìn)一步,還可以將本地記錄的所有數(shù)據(jù)庫(kù)操作指令連同本地記錄的預(yù)測(cè)執(zhí) 行數(shù)據(jù)一并下發(fā)給數(shù)據(jù)庫(kù)。
進(jìn)一步,在一種根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)的可選實(shí)施方式中,數(shù)據(jù)庫(kù)操作裝置可以根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令,判斷目標(biāo)事務(wù)是否為單機(jī)事務(wù);若判斷結(jié)果為是,則根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),以單機(jī)事務(wù)處理邏輯控制數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù);若判斷結(jié)果為否,則根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),以分布式事務(wù)處理邏輯控制數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
其中,基于預(yù)測(cè)執(zhí)行過(guò)程中獲得的數(shù)據(jù)庫(kù)操作指令可以識(shí)別出目標(biāo)事務(wù)是單機(jī)事務(wù)還是分布式事務(wù)。例如,可以判斷本地記錄的數(shù)據(jù)庫(kù)操作指令的操作對(duì)象是否作用于同一物理設(shè)備上,若判斷結(jié)果為是,則可以確定該目標(biāo)事務(wù)為單機(jī)事務(wù);若判斷結(jié)果為否,則可以確定該目標(biāo)事務(wù)為分布式事務(wù)。
由于分布式事務(wù)的處理邏輯和單機(jī)事務(wù)的處理邏輯有所不同,單機(jī)事務(wù)的處理邏輯相對(duì)簡(jiǎn)單,例如不涉及讀寫加鎖等問(wèn)題,所以所消耗的資源也相對(duì)較少?;诖耍緦?shí)施例通過(guò)識(shí)別目標(biāo)事務(wù)是否為單機(jī)事務(wù),在識(shí)別為單機(jī)事務(wù)時(shí)采用單機(jī)事務(wù)的處理邏輯進(jìn)行處理,而不是像現(xiàn)有技術(shù)那樣統(tǒng)一采用分布式事務(wù)處理邏輯進(jìn)行處理,有利于提高處理效率,節(jié)約處理成本。
在一可選實(shí)施方式中,若數(shù)據(jù)庫(kù)操作裝置獲取到目標(biāo)事務(wù)中的事務(wù)回滾指令(即應(yīng)用服務(wù)器執(zhí)行到事務(wù)回滾指令)時(shí),可以刪除本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),例如可以直接清空本地內(nèi)存庫(kù),實(shí)現(xiàn)回滾操作。在該情況下,由于目標(biāo)事務(wù)并未在數(shù)據(jù)庫(kù)中真正執(zhí)行,所以數(shù)據(jù)庫(kù)無(wú)需執(zhí)行回滾操作,可見(jiàn),在事務(wù)回滾這種情況下,采用本實(shí)施例方法也可以提高事務(wù)執(zhí)行效率。
由上述可見(jiàn),在本實(shí)施例提供的方法中,數(shù)據(jù)庫(kù)操作裝置與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程加入預(yù)測(cè)執(zhí)行過(guò)程,在預(yù)測(cè)執(zhí)行過(guò)程中,可以提前獲得目標(biāo)事務(wù)的執(zhí)行路徑,即真正需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并僅針對(duì)屬于修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,或者僅針對(duì)屬于被加鎖的 非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),以適應(yīng)于讀已提交隔離級(jí)別下的加鎖方案,為真實(shí)執(zhí)行事務(wù)提供了條件,之后在根據(jù)記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)實(shí)際執(zhí)行該目標(biāo)事務(wù)時(shí),例如基于預(yù)測(cè)執(zhí)行數(shù)據(jù)可以提前獲取有關(guān)數(shù)據(jù)信息并且可以減少指令之間的跳轉(zhuǎn)等,因此可以提高執(zhí)行效率,增大事務(wù)吞吐量。
下面以減庫(kù)存事務(wù)為例,詳細(xì)說(shuō)明本申請(qǐng)技術(shù)方案的工作流程。其中,數(shù)據(jù)庫(kù)的隔離級(jí)別為讀已提交這一隔離級(jí)別。
減庫(kù)存事務(wù)的SQL代碼如下,括號(hào)內(nèi)的文字為注釋:
begin transaction(開(kāi)始事務(wù))
select*from inventory where itemId=?for update(用商品id查看當(dāng)前庫(kù)存,注意這里用for update外部顯示加鎖)
if(item.inventory>0)
item.inventory--;
update inventory set item.inventory=$item.inventory where itemId=?
commit;
else
rollback;(如果當(dāng)前庫(kù)存大于0,則減少、更新商品庫(kù)存并提交,否則回滾)
在實(shí)際執(zhí)行過(guò)程中,應(yīng)用服務(wù)器負(fù)責(zé)該減庫(kù)存事務(wù)的整個(gè)邏輯,數(shù)據(jù)庫(kù)操作裝置(或者也可稱為執(zhí)行服務(wù)器)只會(huì)獲取應(yīng)用服務(wù)器執(zhí)行到的開(kāi)始事務(wù),需要執(zhí)行的SQL語(yǔ)句,以及提交/回滾指令。
首先,開(kāi)始事務(wù)后,數(shù)據(jù)庫(kù)操作裝置在本地創(chuàng)建內(nèi)存庫(kù);
當(dāng)數(shù)據(jù)庫(kù)操作裝置獲取到select*from inventory where itemId=?for update這條SQL語(yǔ)句時(shí),識(shí)別出這條SQL語(yǔ)句不會(huì)修改數(shù)據(jù)庫(kù),因此將這條SQL語(yǔ)句直接作用在實(shí)際數(shù)據(jù)庫(kù)中,即在數(shù)據(jù)庫(kù)中執(zhí)行該條SQL語(yǔ)句以獲得查詢結(jié)果,即讀數(shù)據(jù)集,將全部查詢結(jié)果返回給應(yīng)用服務(wù)器,以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的SQL語(yǔ)句,并在本地內(nèi)存庫(kù)中記錄這條SQL語(yǔ)句。雖然是讀已隔離級(jí)別,但由于該語(yǔ)句被加鎖,故需要記錄執(zhí)行該條SQL語(yǔ)句有關(guān)的 數(shù)據(jù),優(yōu)選的可以僅記錄該SQL語(yǔ)句所查詢的數(shù)據(jù)的主鍵ID和版本號(hào)(version)。
應(yīng)用服務(wù)器收到數(shù)據(jù)庫(kù)操作裝置返回的查詢結(jié)果后,判斷查詢結(jié)果中當(dāng)前庫(kù)存量是否大于0,若判斷結(jié)果為是,則將當(dāng)前庫(kù)存量減少,并執(zhí)行更新語(yǔ)句,即update inventory set item.inventory=$item.inventory where itemId=?;若判斷結(jié)果為否,則執(zhí)行rollback語(yǔ)句。
第一種情況,假設(shè)應(yīng)用服務(wù)器執(zhí)行了rollback語(yǔ)句,則數(shù)據(jù)庫(kù)操作裝置會(huì)獲取到rollback語(yǔ)句。一旦數(shù)據(jù)庫(kù)存儲(chǔ)裝置獲取到rollback語(yǔ)句,則清空本地內(nèi)存庫(kù),主要是指清空之前記錄的select*from inventory where itemId=?for update這條SQL語(yǔ)句。在這種情況下,因?yàn)槭聞?wù)并沒(méi)有在數(shù)據(jù)庫(kù)中執(zhí)行,所以無(wú)需數(shù)據(jù)庫(kù)執(zhí)行回滾操作。
第二種情況,假設(shè)應(yīng)用服務(wù)器執(zhí)行了update inventory set item.inventory=$item.inventory where itemId=?這條語(yǔ)句,則數(shù)據(jù)庫(kù)操作裝置會(huì)獲取到update inventory set item.inventory=$item.inventory where itemId=?這條語(yǔ)句。則數(shù)據(jù)庫(kù)操作裝置獲取到update inventory set item.inventory=?where itemId=?這條SQL語(yǔ)句時(shí),識(shí)別出該SQL語(yǔ)句會(huì)修改數(shù)據(jù)庫(kù),于是將這條SQL語(yǔ)句拆解為一個(gè)讀指令,即select*from inventory where itemId=?和一個(gè)寫指令,即update inventory set item.inventory=?where itemId=?;接著,將select*from inventory where itemId=?這個(gè)語(yǔ)句下發(fā)到數(shù)據(jù)庫(kù)中,獲得讀數(shù)據(jù)集,將讀數(shù)據(jù)集中的數(shù)據(jù)寫入本地內(nèi)存庫(kù)中;其中,讀數(shù)據(jù)集中包括主鍵列表(itemId)和該主鍵對(duì)應(yīng)的版本號(hào)(version)。然后,根據(jù)update inventory set item.inventory=?where itemId=?這個(gè)語(yǔ)句在本地內(nèi)存庫(kù)中進(jìn)行更新操作,以獲得結(jié)果數(shù)據(jù)集,并將結(jié)果數(shù)據(jù)集返回給應(yīng)用服務(wù)器。該結(jié)果數(shù)據(jù)集可以是類似修改了幾條記錄這樣的修改記錄信息,例如,affectRow=1表示修改了一條記錄;或者,結(jié)果數(shù)據(jù)集也可以是記錄修改詳細(xì)信息的修改詳情信息。其中,結(jié)果數(shù)據(jù)集和讀數(shù)據(jù)集構(gòu)成預(yù)測(cè)執(zhí)行數(shù)據(jù)。
應(yīng)用服務(wù)器此時(shí)執(zhí)行commit指令。
當(dāng)數(shù)據(jù)庫(kù)操作裝置獲取到commit指令后,基于本地內(nèi)存庫(kù)中的SQL語(yǔ)句 以及預(yù)測(cè)執(zhí)行數(shù)據(jù),在數(shù)據(jù)庫(kù)中執(zhí)行該減庫(kù)存事務(wù),這次事務(wù)執(zhí)行過(guò)程是真實(shí)執(zhí)行的。例如,本地記錄的SQL語(yǔ)句以及預(yù)測(cè)執(zhí)行數(shù)據(jù)如下所示:
優(yōu)選的,數(shù)據(jù)庫(kù)操作裝置可以一次性將本地內(nèi)存庫(kù)中的SQL語(yǔ)句全部提交到數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)基于此進(jìn)行執(zhí)行,有利于節(jié)約傳輸SQL語(yǔ)句所消耗的網(wǎng)絡(luò)資源。
這次真實(shí)執(zhí)行也會(huì)返回執(zhí)行結(jié)果,可以將預(yù)測(cè)執(zhí)行結(jié)果與實(shí)際執(zhí)行結(jié)果進(jìn)行比較,例如可以先比較兩個(gè)結(jié)果中的主鍵ID和版本號(hào),然后再比較兩個(gè)結(jié)果中的affectRow;如果比較結(jié)果為相同,則可以在數(shù)據(jù)庫(kù)中提交這次事務(wù),而如果比較結(jié)果為不相同,則認(rèn)為提交是失敗的,由于在這種情況下,事務(wù)本身其實(shí)一直都沒(méi)有真正的在數(shù)據(jù)庫(kù)中執(zhí)行提交,所以可以簡(jiǎn)單地回滾整個(gè)請(qǐng)求,讓應(yīng)用服務(wù)器重新提交即可。
其中,經(jīng)過(guò)上述預(yù)測(cè)執(zhí)行,已經(jīng)獲得了所有的需要執(zhí)行的SQL語(yǔ)句,以及相應(yīng)的預(yù)測(cè)執(zhí)行數(shù)據(jù),例如全部切分條件,數(shù)值的索引、版本號(hào)等,而這些數(shù)據(jù)足以讓我們提前對(duì)事務(wù)是否是單機(jī)事務(wù)做出判斷?;诖耍梢圆捎孟鄳?yīng)的事務(wù)處理邏輯進(jìn)行處理,有利于節(jié)約資源。
圖4為本申請(qǐng)又一實(shí)施例提供的數(shù)據(jù)庫(kù)操作方法的流程示意圖。如圖4所示,該方法包括:
401、在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令。
402、對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄數(shù)據(jù)庫(kù) 操作指令以及在數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí)記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。
403、當(dāng)獲取到目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
本實(shí)施例與圖3所示實(shí)施例相類似,區(qū)別在于:僅記錄目標(biāo)事務(wù)中被加鎖的非修改數(shù)據(jù)庫(kù)類指令的預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),對(duì)于修改數(shù)據(jù)庫(kù)類指令的預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)以及未加鎖的非修改數(shù)據(jù)庫(kù)類指令的預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)不作記錄。另外,本實(shí)施例適用于目標(biāo)事務(wù)包括被加鎖的非修改數(shù)據(jù)庫(kù)類指令的情況,所操作的數(shù)據(jù)庫(kù)不僅可以是隔離級(jí)別為讀已提交的數(shù)據(jù)庫(kù)場(chǎng)景,也可以是其它各種數(shù)據(jù)庫(kù)場(chǎng)景。
若將本實(shí)施例提供的方法應(yīng)用于隔離級(jí)別為讀已提交的數(shù)據(jù)庫(kù),則考慮到有些數(shù)據(jù)庫(kù)默認(rèn)是讀已提交這一隔離級(jí)別,例如,Oracle數(shù)據(jù)庫(kù)默認(rèn)是讀已提交這一隔離級(jí)別的,有些數(shù)據(jù)庫(kù)默認(rèn)不是讀已提交這一隔離級(jí)別,例如MySQL數(shù)據(jù)庫(kù)默認(rèn)是可重復(fù)讀這一隔離級(jí)別,于是在執(zhí)行本實(shí)施例提供的方法之前,可以確定數(shù)據(jù)庫(kù)的隔離級(jí)別是否是讀已提交,若不是,則需要預(yù)先配置數(shù)據(jù)庫(kù)為讀已提交這一隔離級(jí)別。例如,可以在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)之前,配置數(shù)據(jù)庫(kù)為讀已提交這一隔離級(jí)別。
在一可選實(shí)施方式中,應(yīng)用服務(wù)器按照現(xiàn)有方式向數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)庫(kù)操作指令,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。數(shù)據(jù)庫(kù)操作裝置可以對(duì)應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的通信進(jìn)行監(jiān)控,以攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)操作指令。
在另一可選實(shí)施方式中,對(duì)應(yīng)用服務(wù)器的處理邏輯進(jìn)行稍微修改,將原來(lái)向數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)庫(kù)操作指令的處理邏輯改為向數(shù)據(jù)庫(kù)操作裝置發(fā)送。基于此,數(shù)據(jù)庫(kù)操作裝置可以接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的數(shù)據(jù)庫(kù)操作指令。
在此說(shuō)明,若目標(biāo)事務(wù)是顯式事務(wù),則目標(biāo)事務(wù)中的首個(gè)指令是事務(wù)開(kāi)始指令,如開(kāi)始事務(wù)(begin transaction),基于此,數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令之前,可以攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的目標(biāo)事務(wù)中的事務(wù)開(kāi)始指令,根據(jù)該事務(wù)開(kāi)始指令,獲知需要執(zhí)行目標(biāo)事務(wù)?;蛘?, 數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令之前,可以接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的目標(biāo)事務(wù)中的事務(wù)開(kāi)始指令,根據(jù)該事務(wù)開(kāi)始指令,獲知需要執(zhí)行目標(biāo)事務(wù)。若目標(biāo)事務(wù)是隱式事務(wù),則目標(biāo)事務(wù)的首個(gè)指令就是數(shù)據(jù)庫(kù)操作指令,不包括獲取事務(wù)開(kāi)始指令的步驟。
數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令后,對(duì)獲取到的數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器,以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令。其中,預(yù)測(cè)執(zhí)行結(jié)果決定著目標(biāo)事務(wù)的執(zhí)行路徑,這里的執(zhí)行路徑是指數(shù)據(jù)庫(kù)操作指令之間的跳轉(zhuǎn)邏輯。通過(guò)將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器,從而達(dá)到由應(yīng)用服務(wù)器控制整個(gè)目標(biāo)事務(wù)的執(zhí)行邏輯的目的。
另外,數(shù)據(jù)庫(kù)操作裝置還需要在本地記錄所獲取到的數(shù)據(jù)庫(kù)操作指令,以及在該數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí),記錄對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。所述修改數(shù)據(jù)庫(kù)類指令是指對(duì)數(shù)據(jù)庫(kù)有修改的數(shù)據(jù)庫(kù)操作指令,例如以u(píng)pdate、insert等開(kāi)頭的指令;一般以select開(kāi)頭的指令不屬于修改數(shù)據(jù)庫(kù)類指令(稱為非修改數(shù)據(jù)庫(kù)類指令)。有時(shí),為了保證事務(wù)的一致性,降低回滾概率,有些非修改數(shù)據(jù)庫(kù)類指令可能需要通過(guò)for update語(yǔ)句進(jìn)行加鎖,例如在上面轉(zhuǎn)賬舉例中,select指令需要加鎖,形成select……for update形式的數(shù)據(jù)庫(kù)操作指令,這種指令可稱為被加鎖的非修改數(shù)據(jù)庫(kù)類指令。所述預(yù)測(cè)執(zhí)行數(shù)據(jù)主要是指對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行過(guò)程中的一些數(shù)據(jù),例如數(shù)據(jù)庫(kù)操作指令所操作的數(shù)據(jù)以及數(shù)據(jù)的主鍵ID(itemId)和主鍵ID對(duì)應(yīng)的版本號(hào)信息(version)。
值得說(shuō)明的是,對(duì)于同一數(shù)據(jù)庫(kù)操作指令來(lái)說(shuō),要么屬于修改數(shù)據(jù)庫(kù)類指令,要么屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令,要么屬于未加鎖的非修改數(shù)據(jù)庫(kù)類指令。在該實(shí)施例中,對(duì)于目標(biāo)事務(wù)中所有被加鎖的非修改數(shù)據(jù)庫(kù)類指令預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)都會(huì)被記錄在本地。
例如,數(shù)據(jù)庫(kù)操作裝置可以在本地創(chuàng)建內(nèi)存庫(kù),將所獲取到的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)存入內(nèi)存庫(kù)中。進(jìn)一步,若預(yù)測(cè)執(zhí)行數(shù)據(jù)不包括預(yù)測(cè)執(zhí) 行結(jié)果,則也可以將預(yù)測(cè)執(zhí)行結(jié)果存入內(nèi)存庫(kù)中。
為了在預(yù)測(cè)執(zhí)行這一核心思想的基礎(chǔ)上實(shí)現(xiàn)對(duì)加鎖方案的模擬,本實(shí)施例針對(duì)被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,記錄其預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),卻不記錄其它數(shù)據(jù)庫(kù)操作指令對(duì)應(yīng)的預(yù)測(cè)執(zhí)行數(shù)據(jù)。由此可見(jiàn),在實(shí)現(xiàn)加鎖方案的情況下,所記錄的數(shù)據(jù)量相對(duì)較少,這樣在后續(xù)基于本地記錄的數(shù)據(jù)庫(kù)操作指令和預(yù)測(cè)執(zhí)行數(shù)據(jù)在數(shù)據(jù)庫(kù)中真實(shí)執(zhí)行目標(biāo)事務(wù)的過(guò)程中,所需處理的數(shù)據(jù)量相對(duì)較少,有利于進(jìn)一步提高執(zhí)行效率和性能,增大事務(wù)吞吐量。
較優(yōu)選的,在數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí),可以僅記錄該數(shù)據(jù)庫(kù)操作指令所操作的數(shù)據(jù)的主鍵ID和版本號(hào)作為預(yù)測(cè)執(zhí)行數(shù)據(jù)。這樣在后續(xù)基于本地記錄的數(shù)據(jù)庫(kù)操作指令和預(yù)測(cè)執(zhí)行數(shù)據(jù)在數(shù)據(jù)庫(kù)中真實(shí)執(zhí)行目標(biāo)事務(wù)的過(guò)程中,所需處理的數(shù)據(jù)量會(huì)進(jìn)一步較少,有利于進(jìn)一步提高執(zhí)行效率和性能,增大事務(wù)吞吐量。另外,有時(shí)數(shù)據(jù)在事務(wù)過(guò)程中可能會(huì)經(jīng)過(guò)多次修改,但最終又回到初始值,但數(shù)據(jù)的主鍵ID和版本號(hào)不會(huì)發(fā)生變化。因此,若采用記錄數(shù)據(jù)本身的方式,在預(yù)測(cè)執(zhí)行與真實(shí)執(zhí)行進(jìn)行比較時(shí)數(shù)據(jù)可能不一樣,就要發(fā)生回滾,而回滾的代價(jià)較大。但是,本實(shí)施例采用只記錄主鍵ID和版本號(hào)的方式,在預(yù)測(cè)執(zhí)行與真實(shí)執(zhí)行進(jìn)行比較時(shí)出現(xiàn)不一致的概率較低,回滾概率較低。
其中,數(shù)據(jù)庫(kù)操作指令對(duì)數(shù)據(jù)庫(kù)的操作主要是訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),則可以模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于所模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行。進(jìn)一步,考慮到屬于非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令不會(huì)引起數(shù)據(jù)庫(kù)的變化,因此可以直接在數(shù)據(jù)庫(kù)中對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,這樣可以節(jié)約模擬數(shù)據(jù)環(huán)境的操作,實(shí)現(xiàn)相對(duì)簡(jiǎn)單,有利于節(jié)約資源,提高執(zhí)行效率。但是,對(duì)于屬于修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,由于其會(huì)引起數(shù)據(jù)庫(kù)的變化(主要是指數(shù)據(jù)庫(kù)中的數(shù)據(jù)被改變),因此需要模擬數(shù)據(jù)環(huán)境,在所模擬的數(shù)據(jù)環(huán)境中進(jìn)行預(yù)測(cè)執(zhí)行。
基于上述分析,一種對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行的方式可以是:
對(duì)獲取到的數(shù)據(jù)庫(kù)操作指令的類別進(jìn)行識(shí)別;
若數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令,則在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于所模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行;
若數(shù)據(jù)庫(kù)操作指令屬于非修改數(shù)據(jù)庫(kù)類指令,在數(shù)據(jù)庫(kù)中執(zhí)行該數(shù)據(jù)庫(kù)操作指令,以對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行。
進(jìn)一步,一種在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于所模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行的實(shí)施方式包括:
將獲取到的數(shù)據(jù)庫(kù)操作指令拆分為一個(gè)讀指令和一個(gè)寫指令,將讀指令運(yùn)行于真正的數(shù)據(jù)庫(kù)上,即在數(shù)據(jù)庫(kù)中執(zhí)行該讀指令以獲取讀數(shù)據(jù)集(ReadSet),將讀數(shù)據(jù)集存入本地內(nèi)存庫(kù)中,以模擬數(shù)據(jù)庫(kù)操作指令所需的數(shù)據(jù)環(huán)境。然后,將寫指令作用于內(nèi)存庫(kù)上,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作指令的預(yù)測(cè)執(zhí)行,即在內(nèi)存庫(kù)中執(zhí)行寫指令以修改讀數(shù)據(jù)集,例如對(duì)讀數(shù)據(jù)集中的有關(guān)數(shù)據(jù)進(jìn)行更新或查詢處理等。其中,執(zhí)行寫指令以修改讀數(shù)據(jù)集可以產(chǎn)生結(jié)果數(shù)據(jù)集(affectRowInMemdb),該結(jié)果數(shù)據(jù)集包括預(yù)測(cè)執(zhí)行結(jié)果。
當(dāng)數(shù)據(jù)庫(kù)操作裝置獲取到目標(biāo)事務(wù)中的事務(wù)提交指令(即應(yīng)用服務(wù)器執(zhí)行到事務(wù)提交指令)時(shí),則可以根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
上述根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)的一種可選實(shí)施方式包括:
數(shù)據(jù)庫(kù)操作裝置向數(shù)據(jù)庫(kù)下發(fā)本地記錄的數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)操作指令,并接收數(shù)據(jù)庫(kù)返回的數(shù)據(jù)庫(kù)操作指令的實(shí)際執(zhí)行結(jié)果;然后,將數(shù)據(jù)庫(kù)操作指令的實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果進(jìn)行比較,若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)提交指令,以供數(shù)據(jù)庫(kù)提交該目標(biāo)事務(wù);若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果不相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)回滾指令,以供數(shù)據(jù)庫(kù)回滾該目標(biāo)事務(wù)。
在上述實(shí)施方式中,考慮到事務(wù)的原子性,通過(guò)將實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí) 行結(jié)果進(jìn)行比較,可以避免事務(wù)執(zhí)行過(guò)程出錯(cuò),有利于提高事務(wù)執(zhí)行的成功概率。
進(jìn)一步,在現(xiàn)有技術(shù)中,由于無(wú)法預(yù)先知道事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,所以只能按照事務(wù)的執(zhí)行邏輯依次執(zhí)行數(shù)據(jù)庫(kù)操作指令,這會(huì)導(dǎo)致應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)之間的頻繁交互,這在遠(yuǎn)程應(yīng)用場(chǎng)景中將會(huì)消耗大量網(wǎng)絡(luò)資源。但在本實(shí)施例中,通過(guò)預(yù)測(cè)執(zhí)行過(guò)程已經(jīng)預(yù)先獲得目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,即本地記錄的數(shù)據(jù)庫(kù)操作指令,因此在向數(shù)據(jù)庫(kù)下發(fā)本地記錄的數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)操作指令的過(guò)程中,可以將本地記錄的數(shù)據(jù)庫(kù)操作指令同時(shí)(或者一并)下發(fā)到數(shù)據(jù)庫(kù),有利于節(jié)約網(wǎng)絡(luò)資源。另外,對(duì)于一些并行的數(shù)據(jù)庫(kù)操作指令,數(shù)據(jù)庫(kù)還可以并行操作,有利于進(jìn)一步提高事務(wù)執(zhí)行效率,增大事務(wù)吞吐量。
進(jìn)一步,還可以將本地記錄的所有數(shù)據(jù)庫(kù)操作指令連同本地記錄的預(yù)測(cè)執(zhí)行數(shù)據(jù)一并下發(fā)給數(shù)據(jù)庫(kù)。
進(jìn)一步,在一種根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)的可選實(shí)施方式中,數(shù)據(jù)庫(kù)操作裝置可以根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令,判斷目標(biāo)事務(wù)是否為單機(jī)事務(wù);若判斷結(jié)果為是,則根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),以單機(jī)事務(wù)處理邏輯控制數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù);若判斷結(jié)果為否,則根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),以分布式事務(wù)處理邏輯控制數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
其中,基于預(yù)測(cè)執(zhí)行過(guò)程中獲得的數(shù)據(jù)庫(kù)操作指令可以識(shí)別出目標(biāo)事務(wù)是單機(jī)事務(wù)還是分布式事務(wù)。例如,可以判斷本地記錄的數(shù)據(jù)庫(kù)操作指令的操作對(duì)象是否作用于同一物理設(shè)備上,若判斷結(jié)果為是,則可以確定該目標(biāo)事務(wù)為單機(jī)事務(wù);若判斷結(jié)果為否,則可以確定該目標(biāo)事務(wù)為分布式事務(wù)。
由于分布式事務(wù)的處理邏輯和單機(jī)事務(wù)的處理邏輯有所不同,單機(jī)事務(wù)的處理邏輯相對(duì)簡(jiǎn)單,例如不涉及讀寫加鎖等問(wèn)題,所以所消耗的資源也相對(duì)較少?;诖?,本實(shí)施例通過(guò)識(shí)別目標(biāo)事務(wù)是否為單機(jī)事務(wù),在識(shí)別為單機(jī)事務(wù) 時(shí)采用單機(jī)事務(wù)的處理邏輯進(jìn)行處理,而不是像現(xiàn)有技術(shù)那樣統(tǒng)一采用分布式事務(wù)處理邏輯進(jìn)行處理,有利于提高處理效率,節(jié)約處理成本。
在一可選實(shí)施方式中,若數(shù)據(jù)庫(kù)操作裝置獲取到目標(biāo)事務(wù)中的事務(wù)回滾指令(即應(yīng)用服務(wù)器執(zhí)行到事務(wù)回滾指令)時(shí),可以刪除本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),例如可以直接清空本地內(nèi)存庫(kù),實(shí)現(xiàn)回滾操作。在該情況下,由于目標(biāo)事務(wù)并未在數(shù)據(jù)庫(kù)中真正執(zhí)行,所以數(shù)據(jù)庫(kù)無(wú)需執(zhí)行回滾操作,可見(jiàn),在事務(wù)回滾這種情況下,采用本實(shí)施例方法也可以提高事務(wù)執(zhí)行效率。
由上述可見(jiàn),在本實(shí)施例提供的方法中,數(shù)據(jù)庫(kù)操作裝置與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程加入預(yù)測(cè)執(zhí)行過(guò)程,在預(yù)測(cè)執(zhí)行過(guò)程中,可以提前獲得目標(biāo)事務(wù)的執(zhí)行路徑,即真正需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并僅針對(duì)屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),以適應(yīng)于加鎖方案,為真實(shí)執(zhí)行事務(wù)提供了條件,之后在根據(jù)記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)實(shí)際執(zhí)行該目標(biāo)事務(wù)時(shí),例如基于預(yù)測(cè)執(zhí)行數(shù)據(jù)可以提前獲取有關(guān)數(shù)據(jù)信息并且可以減少指令之間的跳轉(zhuǎn)等,因此可以提高執(zhí)行效率,增大事務(wù)吞吐量。
需要說(shuō)明的是,對(duì)于前述的各方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請(qǐng)并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請(qǐng),某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說(shuō)明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本申請(qǐng)所必須的。
在上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒(méi)有詳述的部分,可以參見(jiàn)其他實(shí)施例的相關(guān)描述。
圖5為本申請(qǐng)又一實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置的結(jié)構(gòu)示意圖。如圖5所示,該裝置包括:獲取模塊51、預(yù)測(cè)執(zhí)行模塊52和控制執(zhí)行模塊53。
獲取模塊51,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令。
預(yù)測(cè)執(zhí)行模塊52,用于對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄數(shù)據(jù)庫(kù)操作指令以及在數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一時(shí)記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。
控制執(zhí)行模塊53,用于當(dāng)獲取到目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
在一可選實(shí)施方式中,預(yù)測(cè)執(zhí)行模塊52在數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令其中之一時(shí)記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)的過(guò)程中,具體可用于:
在數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí),僅記錄該數(shù)據(jù)庫(kù)操作指令所操作的數(shù)據(jù)的主鍵ID和數(shù)據(jù)版本號(hào)作為預(yù)測(cè)執(zhí)行數(shù)據(jù)。
在一可選實(shí)施方式中,該裝置還包括:配置模塊,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)之前,配置數(shù)據(jù)庫(kù)為讀已提交隔離級(jí)別。
在一可選實(shí)施方式中,預(yù)測(cè)執(zhí)行模塊52具體用于:
若數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令,在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行;
若數(shù)據(jù)庫(kù)操作指令屬于非修改數(shù)據(jù)庫(kù)類指令,在數(shù)據(jù)庫(kù)中執(zhí)行數(shù)據(jù)庫(kù)操作指令,以對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行。
進(jìn)一步,預(yù)測(cè)執(zhí)行模塊52在數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令的情況下,在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行時(shí),具體用于:
將數(shù)據(jù)庫(kù)操作指令拆分為讀指令和寫指令;
在數(shù)據(jù)庫(kù)中執(zhí)行讀指令以獲取讀數(shù)據(jù)集,將讀數(shù)據(jù)集存入內(nèi)存庫(kù)中以模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境;
在內(nèi)存庫(kù)中執(zhí)行寫指令以修改讀數(shù)據(jù)集。
在一可選實(shí)施方式中,控制執(zhí)行模塊53具體可用于:
向數(shù)據(jù)庫(kù)下發(fā)本地記錄的數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)操作指令,并接收數(shù)據(jù)庫(kù)返回的數(shù)據(jù)庫(kù)操作指令的實(shí)際執(zhí)行結(jié)果;
若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)提交指令,以供數(shù)據(jù)庫(kù)提交目標(biāo)事務(wù);
若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果不相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)回滾指令,以供數(shù)據(jù)庫(kù)回滾目標(biāo)事務(wù)。
本實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置,與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程加入預(yù)測(cè)執(zhí)行過(guò)程,預(yù)先獲得并記錄目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,并僅針對(duì)屬于修改數(shù)據(jù)庫(kù)類指令和被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令,或者僅針對(duì)屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操作指令記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),以適應(yīng)于讀已提交隔離級(jí)別下的加鎖方案,為真實(shí)執(zhí)行事務(wù)提供了條件,之后根據(jù)記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行該目標(biāo)事務(wù),有利于提高執(zhí)行效率,進(jìn)而增大事務(wù)吞吐量。
圖6為本申請(qǐng)又一實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置的結(jié)構(gòu)示意圖。如圖6所示,該裝置包括:獲取模塊61、預(yù)測(cè)執(zhí)行模塊62和控制執(zhí)行模塊63。
獲取模塊61,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程中,依次獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令。
預(yù)測(cè)執(zhí)行模塊62,用于對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行,將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器以供應(yīng)用服務(wù)器確定下一個(gè)需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并在本地記錄數(shù)據(jù)庫(kù)操作指令以及在數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí)記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。
控制執(zhí)行模塊63,用于當(dāng)獲取到目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
在一可選實(shí)施方式中,預(yù)測(cè)執(zhí)行模塊62具體可用于:
在數(shù)據(jù)庫(kù)操作指令屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令時(shí),僅記錄該數(shù)據(jù)庫(kù)操作指令所操作的數(shù)據(jù)的主鍵ID和版本號(hào)作為預(yù)測(cè)執(zhí)行數(shù)據(jù)。
在一可選實(shí)施方式中,該裝置還包括:配置模塊,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)之前,配置數(shù)據(jù)庫(kù)為讀已提交隔離級(jí)別。
在一可選實(shí)施方式中,預(yù)測(cè)執(zhí)行模塊62具體用于:
若數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令,在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行;
若數(shù)據(jù)庫(kù)操作指令屬于非修改數(shù)據(jù)庫(kù)類指令,在數(shù)據(jù)庫(kù)中執(zhí)行數(shù)據(jù)庫(kù)操作指令,以對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行。
進(jìn)一步,預(yù)測(cè)執(zhí)行模塊62在數(shù)據(jù)庫(kù)操作指令屬于修改數(shù)據(jù)庫(kù)類指令的情況下,在本地創(chuàng)建的內(nèi)存庫(kù)中模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境,基于模擬的數(shù)據(jù)環(huán)境對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行時(shí),具體用于:
將數(shù)據(jù)庫(kù)操作指令拆分為讀指令和寫指令;
在數(shù)據(jù)庫(kù)中執(zhí)行讀指令以獲取讀數(shù)據(jù)集,將讀數(shù)據(jù)集存入內(nèi)存庫(kù)中以模擬數(shù)據(jù)庫(kù)操作指令的數(shù)據(jù)環(huán)境;
在內(nèi)存庫(kù)中執(zhí)行寫指令以修改讀數(shù)據(jù)集。
在一可選實(shí)施方式中,控制執(zhí)行模塊63具體可用于:
向數(shù)據(jù)庫(kù)下發(fā)本地記錄的數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)操作指令,并接收數(shù)據(jù)庫(kù)返回的數(shù)據(jù)庫(kù)操作指令的實(shí)際執(zhí)行結(jié)果;
若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)提交指令,以供數(shù)據(jù)庫(kù)提交目標(biāo)事務(wù);
若實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果不相同,向數(shù)據(jù)庫(kù)下發(fā)事務(wù)回滾指令,以供數(shù)據(jù)庫(kù)回滾目標(biāo)事務(wù)。
本實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置,與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過(guò)程加入預(yù)測(cè)執(zhí)行過(guò)程,預(yù)先獲得并記錄目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令,并僅針對(duì)屬于被加鎖的非修改數(shù)據(jù)庫(kù)類指令的數(shù)據(jù)庫(kù)操 作指令記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù),以適應(yīng)于加鎖方案,為真實(shí)執(zhí)行事務(wù)提供了條件,之后根據(jù)記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行該目標(biāo)事務(wù),有利于提高執(zhí)行效率,進(jìn)而增大事務(wù)吞吐量。
所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng),裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。
所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。
另外,在本申請(qǐng)各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用硬件加軟件功能單元的形式實(shí)現(xiàn)。
上述以軟件功能單元的形式實(shí)現(xiàn)的集成的單元,可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。上述軟件功能單元存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)或處理器(processor)執(zhí)行本申請(qǐng)各個(gè)實(shí)施例所述方法的部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(Read-Only Memory,ROM)、隨 機(jī)存取存儲(chǔ)器(Random Access Memory,RAM)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
最后應(yīng)說(shuō)明的是:以上實(shí)施例僅用以說(shuō)明本申請(qǐng)的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本申請(qǐng)進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本申請(qǐng)各實(shí)施例技術(shù)方案的精神和范圍。