本申請(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)成,例如結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)語句,這些數(shù)據(jù)庫(kù)操作指令之間存在切分條件以及跳轉(zhuǎn)等邏輯,意味著在一次執(zhí)行過程中該事務(wù)中可能有部分?jǐn)?shù)據(jù)庫(kù)操作指令被跳過不執(zhí)行。但在現(xiàn)有技術(shù)中,由于無法預(yù)先獲知事務(wù)中需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,因此只能按照?qǐng)?zhí)行邏輯邊執(zhí)行邊判斷,依次執(zhí)行事務(wù)中的語句,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。這種事務(wù)執(zhí)行方式效率較低,事務(wù)吞吐量較低。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)的多個(gè)方面提供一種數(shù)據(jù)庫(kù)操作方法及裝置,用以提高事務(wù)執(zhí)行效率并增大事務(wù)吞吐量。
本申請(qǐng)的一方面,提供一種數(shù)據(jù)庫(kù)操作方法,包括:
在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過程中,依次獲取所述應(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ù)操作指令以及所述預(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ù)的過程中,依次獲取所述應(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ù)操作指令以及所述預(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ù)的過程加入預(yù)測(cè)執(zhí)行過程,預(yù)先獲得并記錄目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(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ù)吞吐量。
【附圖說明】
為了更清楚地說明本申請(qǐng)實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖是本申請(qǐng)的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(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ù)操作裝置的結(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ù)人員在沒有作出創(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。其中,數(shù)據(jù)庫(kù)20可以為一個(gè),也可以為多個(gè)。圖1中僅示例性的示出一個(gè)數(shù)據(jù)庫(kù)20。當(dāng)需要以事務(wù)方式對(duì)數(shù)據(jù)庫(kù)20進(jìn)行訪問時(shí),應(yīng)用服務(wù)器10執(zhí)行事務(wù)邏輯,依次將事務(wù)中的數(shù)據(jù)庫(kù)操作指令作用于數(shù)據(jù)庫(kù)20上。這種事務(wù)執(zhí)行方式的效率較低,事務(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ù)操作方法,實(shí)現(xiàn)一種新的事務(wù)執(zhí)行邏輯,即先對(duì)事務(wù)進(jìn)行預(yù)測(cè)執(zhí)行,提前獲得該事務(wù)中需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,實(shí)現(xiàn)執(zhí)行路徑的預(yù)測(cè),進(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ù)量。
值得說明的是,數(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í)施例將具體說明本申請(qǐng)技術(shù)方案的方法流程。
圖3為本申請(qǐng)一實(shí)施例提供的數(shù)據(jù)庫(kù)操作方法的流程示意圖。如圖3所示,該方法包括:
301、在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過程中,依次獲取應(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ù)操作指令以及預(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ù)。
首先說明,為便于描述,本實(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ù)開始指令、事務(wù)提交指令、事務(wù)回滾指令等。這些指令實(shí)際上是由數(shù)據(jù)庫(kù)語言編寫的語句。根據(jù)數(shù)據(jù)庫(kù)語言的不同,這些指令可以是不同語言編寫的語句。舉例說明,若采用SQL,則上述數(shù)據(jù)庫(kù)操作指令和控制指令實(shí)際上是一系列的SQL語句。
具體的,應(yīng)用服務(wù)器控制整個(gè)目標(biāo)事務(wù)的執(zhí)行邏輯,可以按照現(xiàn)有方式執(zhí)行目標(biāo)事務(wù)。數(shù)據(jù)庫(kù)操作裝置在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過程中,依次獲取應(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ù)的訪問。數(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)行稍微修改,將原來向數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)庫(kù)操作指令的邏輯改為向數(shù)據(jù)庫(kù)操作裝置發(fā)送?;诖耍瑪?shù)據(jù)庫(kù)操作裝置可以接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的數(shù)據(jù)庫(kù)操作指令。
在此說明,若目標(biāo)事務(wù)是顯式事務(wù),則目標(biāo)事務(wù)中的首個(gè)指令是事務(wù)開始指令,如開始事務(wù)(begin transaction),基于此,數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令之前,可以攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的 目標(biāo)事務(wù)中的事務(wù)開始指令,根據(jù)該事務(wù)開始指令,獲知需要執(zhí)行目標(biāo)事務(wù)?;蛘?,數(shù)據(jù)庫(kù)操作裝置在獲取應(yīng)用服務(wù)器執(zhí)行到的數(shù)據(jù)庫(kù)操作指令之前,可以接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的目標(biāo)事務(wù)中的事務(wù)開始指令,根據(jù)該事務(wù)開始指令,獲知需要執(zhí)行目標(biāo)事務(wù)。若目標(biāo)事務(wù)是隱式事務(wù),則目標(biāo)事務(wù)的首個(gè)指令就是數(shù)據(jù)庫(kù)操作指令,不包括獲取事務(wù)開始指令的步驟。
數(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)邏輯。通過將預(yù)測(cè)執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器,從而達(dá)到由應(yīng)用服務(wù)器控制整個(gè)目標(biāo)事務(wù)的執(zhí)行邏輯的目的。
另外,數(shù)據(jù)庫(kù)操作裝置還需要在本地記錄所獲取到的數(shù)據(jù)庫(kù)操作指令,以及記錄對(duì)該數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。所述預(yù)測(cè)執(zhí)行數(shù)據(jù)主要是指對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行過程中的一些數(shù)據(jù)。
例如,數(shù)據(jù)庫(kù)操作裝置可以在本地創(chuàng)建內(nèi)存庫(kù),將所獲取到的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)存入內(nèi)存庫(kù)中。
其中,數(shù)據(jù)庫(kù)操作指令對(duì)數(shù)據(jù)庫(kù)的操作主要是訪問數(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í)行?;诖耍环N對(duì)數(shù)據(jù)庫(kù)操作指令進(jìn)行預(yù)測(cè)執(zhí)行的方式可以是:在本地創(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í)行。
進(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í)行過程中,數(shù)據(jù)庫(kù)操作裝置可以在本地記錄讀指令所讀取的讀數(shù)據(jù)集以及執(zhí)行寫指令產(chǎn)生的結(jié)果數(shù)據(jù)集。由此可見,所述預(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í)索引、主鍵值等。
數(shù)據(jù)庫(kù)操作裝置對(duì)依次獲取到的數(shù)據(jù)庫(kù)操作指令分別執(zhí)行上述預(yù)測(cè)操作,獲得各數(shù)據(jù)庫(kù)操作指令及其對(duì)應(yīng)的預(yù)測(cè)執(zhí)行數(shù)據(jù)存儲(chǔ)到內(nèi)存庫(kù)中。
當(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ù)。
由上述可見,數(shù)據(jù)庫(kù)操作裝置與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過程加入預(yù)測(cè)執(zhí)行過程,預(yù)先獲得并記錄目標(biāo)事務(wù)需要執(zhí)行的全部數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),為真實(shí)執(zhí)行事務(wù)提供了條件,之后在根據(jù)記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù)實(shí)際執(zhí)行該目標(biāo)事務(wù)時(shí),可以提前獲取有關(guān)數(shù)據(jù)信息并且可以減少指令之間的跳轉(zhuǎn)等,有利于提高執(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ù)的一種可選實(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ù)的原子性,通過將實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果進(jìn)行比較,可以避免事務(wù)執(zhí)行過程出錯(cuò),有利于提高事務(wù)執(zhí)行的成功概率。
進(jìn)一步,在現(xiàn)有技術(shù)中,由于無法預(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í)施例中,通過預(yù)測(cè)執(zhí)行過程已經(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ù)操作指令的過程中,可以將本地記錄的數(shù)據(jù)庫(kù)操作指令同時(shí)(或者一并)下發(fā)到數(shù)據(jù)庫(kù),有利于節(jié)約網(wǎng)絡(luò)資源。另外,對(duì)于一些并行的數(shù)據(jù)庫(kù)操作指令,數(shù)據(jù)庫(kù)還可以并行操作,有利于進(jìn)一步提高事務(wù)執(zhí)行效率。
進(jìn)一步,還可以將本地記錄的所有數(shù)據(jù)庫(kù)操作指令連同本地記錄的預(yù)測(cè)執(zhí)行數(shù)據(jù)一并下發(fā)給數(shù)據(jù)庫(kù)。
進(jìn)一步,在一種根據(jù)內(nèi)存庫(kù)中存儲(chǔ)的數(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í)行過程中獲得的數(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)單,例如不涉及讀寫加鎖等問題,所以所消耗的資源也相 對(duì)較少。基于此,本實(shí)施例通過識(shí)別目標(biāo)事務(wù)是否為單機(jī)事務(wù),在識(shí)別為單機(jī)事務(wù)時(shí)采用單機(jī)事務(wù)的處理邏輯進(jìn)行處理,有利于提高處理效率,節(jié)約處理成本。
在一可選實(shí)施方式中,若數(shù)據(jù)庫(kù)操作裝置獲取到目標(biāo)事務(wù)中的事務(wù)回滾指令(即應(yīng)用服務(wù)器執(zhí)行到事務(wù)回滾指令)時(shí),可以直接清空本地內(nèi)存庫(kù),實(shí)現(xiàn)回滾操作。在該情況下,由于目標(biāo)事務(wù)并未在數(shù)據(jù)庫(kù)中真正執(zhí)行,所以數(shù)據(jù)庫(kù)無需執(zhí)行回滾操作,可見,在這種情況下,采用本實(shí)施例方法也可以提高事務(wù)執(zhí)行效率。
下面以減庫(kù)存事務(wù)為例,詳細(xì)說明本申請(qǐng)技術(shù)方案的工作流程。
減庫(kù)存事務(wù)的SQL代碼如下,括號(hào)內(nèi)的文字為注釋:
begin transaction(開始事務(wù))
select*from inventory where itemId=?for update(用商品id查看當(dāng)前庫(kù)存,并鎖定)
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í)行過程中,應(yīng)用服務(wù)器負(fù)責(zé)該減庫(kù)存事務(wù)的整個(gè)邏輯,數(shù)據(jù)庫(kù)操作裝置(或者也可稱為執(zhí)行服務(wù)器)只會(huì)獲取應(yīng)用服務(wù)器執(zhí)行到的開始事務(wù),需要執(zhí)行的SQL語句,以及提交/回滾指令。
首先,開始事務(wù)后,數(shù)據(jù)庫(kù)操作裝置在本地創(chuàng)建內(nèi)存庫(kù);
當(dāng)數(shù)據(jù)庫(kù)操作裝置獲取到select*from inventory where itemId=?for update這條SQL語句時(shí),將這條SQL語句直接在數(shù)據(jù)庫(kù)中進(jìn)行查找,并 在本地內(nèi)存庫(kù)中記錄下這次查詢結(jié)果(即查詢到的待處理數(shù)據(jù),也就是當(dāng)前庫(kù)存量),并將全部查詢結(jié)果返回給應(yīng)用服務(wù)器。
值得說明的是,由于該SQL語句是一條查詢語句,所以對(duì)該語句進(jìn)行拆分與否其結(jié)果都相同,為了簡(jiǎn)化操作可以不對(duì)查詢語句進(jìn)行拆分。
應(yīng)用服務(wù)器收到數(shù)據(jù)庫(kù)操作裝置返回的查詢結(jié)果后,判斷查詢結(jié)果是否大于0,若判斷結(jié)果為是,則將當(dāng)前庫(kù)存量減少,并執(zhí)行更新語句,即update inventory set item.inventory=$item.inventory where itemId=?;若判斷結(jié)果為否,則執(zhí)行回滾語句。
若數(shù)據(jù)庫(kù)操作裝置收到了rollback語句,則清空本地內(nèi)存庫(kù)。在這種情況下,因?yàn)槭聞?wù)并沒有在數(shù)據(jù)庫(kù)中執(zhí)行,所以無需數(shù)據(jù)庫(kù)執(zhí)行回滾操作。
若數(shù)據(jù)庫(kù)操作裝置收到了更新語句,即update inventory set item.inventory=?where itemId=?,則將這條SQL語句拆解為一個(gè)讀數(shù)據(jù)庫(kù)指令,即select*from inventory where itemId=?和一個(gè)寫數(shù)據(jù)庫(kù)指令,即update inventory set item.inventory=?where itemId=?;接著,將select*from inventory where itemId=?這個(gè)語句下發(fā)到數(shù)據(jù)庫(kù)中,獲得讀數(shù)據(jù)集,將讀數(shù)據(jù)集中的數(shù)據(jù)寫入本地內(nèi)存庫(kù)中;再根據(jù)update inventory set item.inventory=?where itemId=?這個(gè)語句在本地內(nèi)存庫(kù)中進(jìn)行更新操作,以獲得結(jié)果數(shù)據(jù)集,并將結(jié)果數(shù)據(jù)集中的執(zhí)行結(jié)果返回給應(yīng)用服務(wù)器。應(yīng)用服務(wù)器此時(shí)執(zhí)行commit指令。其中,結(jié)果數(shù)據(jù)集和讀數(shù)據(jù)集中的數(shù)據(jù)構(gòu)成預(yù)測(cè)執(zhí)行數(shù)據(jù)。
當(dāng)數(shù)據(jù)庫(kù)操作裝置獲取到commit指令后,基于內(nèi)存庫(kù)中存儲(chǔ)的SQL語句以及預(yù)測(cè)執(zhí)行數(shù)據(jù),在數(shù)據(jù)庫(kù)中執(zhí)行該減庫(kù)存事務(wù),這次事務(wù)執(zhí)行過程是真實(shí)執(zhí)行的。
優(yōu)選的,數(shù)據(jù)庫(kù)操作裝置可以一次性將本地內(nèi)存庫(kù)中的SQL語句全部提交到數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)基于此進(jìn)行執(zhí)行,有利于節(jié)約傳輸SQL語句所消耗的網(wǎng)絡(luò)資源。
這次真實(shí)執(zhí)行也會(huì)返回執(zhí)行結(jié)果,可以將預(yù)測(cè)執(zhí)行結(jié)果與實(shí)際執(zhí)行結(jié)果 進(jìn)行比較,如果比較結(jié)果為相同,則可以在數(shù)據(jù)庫(kù)中提交這次事務(wù),而如果比較結(jié)果為不相同,則認(rèn)為提交是失敗的,由于在這種情況下,事務(wù)本身其實(shí)一直都沒有真正的在數(shù)據(jù)庫(kù)中執(zhí)行提交,所以可以簡(jiǎn)單地回滾整個(gè)請(qǐng)求,讓應(yīng)用服務(wù)器重新提交即可。
其中,經(jīng)過上述預(yù)測(cè)執(zhí)行,已經(jīng)獲得了所有的需要執(zhí)行的SQL語句,以及他們對(duì)應(yīng)的預(yù)測(cè)執(zhí)行數(shù)據(jù),例如全部切分條件,數(shù)值的索引等,而這些數(shù)據(jù)足以讓我們提前對(duì)事務(wù)是否是單機(jī)事務(wù)做出判斷?;诖?,可以采用相應(yīng)的事務(wù)處理邏輯進(jìn)行處理,有利于節(jié)約資源。
需要說明的是,對(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)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本申請(qǐng)所必須的。
在上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒有詳述的部分,可以參見其他實(shí)施例的相關(guān)描述。
圖4為本申請(qǐng)一實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置的結(jié)構(gòu)示意圖。如圖4所示,該裝置包括:獲取模塊41、預(yù)測(cè)執(zhí)行模塊42和控制執(zhí)行模塊43。
獲取模塊41,用于在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過程中,依次獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令。
預(yù)測(cè)執(zhí)行模塊42,用于對(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ù)操作指令以及預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(jù)。
控制執(zhí)行模塊43,用于當(dāng)獲取到目標(biāo)事務(wù)中的事務(wù)提交指令時(shí),根據(jù)內(nèi)存庫(kù)中存儲(chǔ)的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),控制應(yīng)用服務(wù)器對(duì)應(yīng)的數(shù)據(jù)庫(kù)實(shí)際執(zhí)行目標(biāo)事務(wù)。
在一可選實(shí)施方式中,獲取模塊41具體可用于:攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)操作指令;或者,接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的數(shù)據(jù)庫(kù)操作指 令。
在一可選實(shí)施方式中,獲取模塊41還用于:在獲取應(yīng)用服務(wù)器執(zhí)行到的目標(biāo)事務(wù)中的數(shù)據(jù)庫(kù)操作指令之前,攔截應(yīng)用服務(wù)器發(fā)往數(shù)據(jù)庫(kù)的目標(biāo)事務(wù)中的事務(wù)開始指令;或者,接收應(yīng)用服務(wù)器主動(dòng)下發(fā)的目標(biāo)事務(wù)中的事務(wù)開始指令。
在一可選實(shí)施方式中,預(yù)測(cè)執(zhí)行模塊42具體用于:
在本地創(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í)行。
進(jìn)一步,預(yù)測(cè)執(zhí)行模塊42具體用于:
將數(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í)行模塊43具體用于:
向數(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ù)。
考慮到事務(wù)的原子性,控制執(zhí)行模塊43通過將實(shí)際執(zhí)行結(jié)果與預(yù)測(cè)執(zhí)行結(jié)果進(jìn)行比較,可以避免事務(wù)執(zhí)行過程出錯(cuò),有利于提高事務(wù)執(zhí)行的成功概率。
進(jìn)一步,控制執(zhí)行模塊43具體用于:在向數(shù)據(jù)庫(kù)下發(fā)本地記錄的數(shù)據(jù)庫(kù)操作指令,以指示數(shù)據(jù)庫(kù)執(zhí)行本地記錄的數(shù)據(jù)庫(kù)操作指令的過程中,將本地記錄的數(shù)據(jù)庫(kù)操作指令同時(shí)下發(fā)給數(shù)據(jù)庫(kù),有利于節(jié)約網(wǎng)絡(luò)資源。
在一可選實(shí)施方式中,控制執(zhí)行模塊43具體用于:
根據(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ù)。
由于分布式事務(wù)的處理邏輯和單機(jī)事務(wù)的處理邏輯有所不同,單機(jī)事務(wù)的處理邏輯相對(duì)簡(jiǎn)單,例如不涉及讀寫加鎖等問題,所以所消耗的資源也相對(duì)較少?;诖耍刂茍?zhí)行模塊43通過識(shí)別目標(biāo)事務(wù)是否為單機(jī)事務(wù),在識(shí)別為單機(jī)事務(wù)時(shí)采用單機(jī)事務(wù)的處理邏輯進(jìn)行處理,有利于提高處理效率,節(jié)約處理成本。
在一可選實(shí)施方式中,預(yù)測(cè)執(zhí)行模塊42還用于:在獲取到目標(biāo)事務(wù)中的事務(wù)回滾指令時(shí),刪除本地記錄的數(shù)據(jù)庫(kù)操作指令以及預(yù)測(cè)執(zhí)行數(shù)據(jù),例如清空內(nèi)存庫(kù)。
本實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置,其可以單獨(dú)部署,位于應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)之間,也可以部署于應(yīng)用服務(wù)器一端實(shí)現(xiàn),或者也可以部署于數(shù)據(jù)庫(kù)一端實(shí)現(xiàn)。
本實(shí)施例提供的數(shù)據(jù)庫(kù)操作裝置,與應(yīng)用服務(wù)器相互配合,在應(yīng)用服務(wù)器執(zhí)行目標(biāo)事務(wù)的過程加入預(yù)測(cè)執(zhí)行過程,在預(yù)測(cè)執(zhí)行過程中,可以提前獲得目標(biāo)事務(wù)的執(zhí)行路徑,即真正需要執(zhí)行的數(shù)據(jù)庫(kù)操作指令,并記錄預(yù)測(cè)執(zhí)行產(chǎn)生的預(yù)測(cè)執(zhí)行數(shù)據(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ù)吞吐量。
所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過程,在此不再贅述。
在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和 方法,可以通過其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部單元來實(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)說明的是:以上實(shí)施例僅用以說明本申請(qǐng)的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本申請(qǐng)進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本申請(qǐng)各實(shí)施例技術(shù)方案的精神和范圍。