一種數(shù)據(jù)庫交易結(jié)果確認(rèn)方法、裝置及系統(tǒng)的制作方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明屬于數(shù)據(jù)庫處理領(lǐng)域,尤其涉及一種數(shù)據(jù)庫交易結(jié)果確認(rèn)方法、裝置及系統(tǒng)?!?br>背景技術(shù):
】[0002]在一個支持交易(Transact1n)的數(shù)據(jù)庫系統(tǒng)中,原子性(Atomicity)是必須要具備的特性,否則在交易過程(Transact1nprocessing)中無法保證數(shù)據(jù)的正確性,交易過程極可能達(dá)不到交易的要求。[0003]原子性(Atomicity)是指整個交易中的所有操作要么全部完成,要么全部不完成,不可能停滯在中間某個環(huán)節(jié)。交易在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到交易開始前的狀態(tài),就像該交易從來沒有執(zhí)行過一樣。[0004]當(dāng)前支持交易的數(shù)據(jù)庫系統(tǒng)的主流為關(guān)系型數(shù)據(jù)庫,如ORACLE,DB2,SQLServer等。關(guān)系型數(shù)據(jù)庫均采用C/S架構(gòu),數(shù)據(jù)庫交易動作由客戶端發(fā)起,數(shù)據(jù)庫服務(wù)器負(fù)責(zé)執(zhí)行,并向客戶端返回交易執(zhí)行結(jié)果,客戶端可以據(jù)此判斷交易是否成功。但是,當(dāng)發(fā)生掉電、網(wǎng)絡(luò)中斷、硬件故障或數(shù)據(jù)庫宕機(jī)等意外事件時,客戶端無法從數(shù)據(jù)庫服務(wù)器獲取交易執(zhí)行結(jié)果,從而無法判斷數(shù)據(jù)庫交易是否執(zhí)行成功。[0005]現(xiàn)有技術(shù)中,當(dāng)客戶端未從數(shù)據(jù)庫服務(wù)器獲取交易執(zhí)行結(jié)果時,為了判斷數(shù)據(jù)庫交易是否執(zhí)行成功,客戶端通常需要在故障恢復(fù)后,向數(shù)據(jù)庫服務(wù)器重新發(fā)起對不可以判定交易的內(nèi)容查詢,通過查詢的交易內(nèi)容中的特征數(shù)據(jù)來判定交易是否執(zhí)行成功。[0006]例如,客戶端的應(yīng)用程序中有一張用戶信息表,該表中有一個字段為用戶姓名,并且該字段的數(shù)據(jù)只能是唯一的,應(yīng)用程序向該表中插入一條數(shù)據(jù),其中用戶姓名字段的信息為“張三”,該數(shù)據(jù)是本次交易中的特征數(shù)據(jù)。應(yīng)用程序通過客戶端接口向數(shù)據(jù)庫服務(wù)器提交該插入交易。假設(shè)在數(shù)據(jù)庫服務(wù)器返回該交易結(jié)果之前,客戶端與數(shù)據(jù)庫服務(wù)器之間的網(wǎng)絡(luò)短暫中斷,應(yīng)用程序沒有收到數(shù)據(jù)庫服務(wù)器返回的交易執(zhí)行結(jié)果,無法判斷該交易是否成功。在這種情況下,應(yīng)用程序只能自動或者由人工發(fā)起一個對用戶信息表中的特征數(shù)據(jù)“張三“的查詢,如果查詢結(jié)果中該數(shù)據(jù)存在,則就認(rèn)為該交易成功,如果查詢結(jié)果中沒有該數(shù)據(jù),則就認(rèn)為該交易失敗,重新執(zhí)行該數(shù)據(jù)插入動作。[0007]由于各個交易的特征數(shù)據(jù)基本上不同的,缺乏一種通用的辦法來判定交易的執(zhí)行結(jié)果,一般都是由用戶通過對特征數(shù)據(jù)閱讀和確認(rèn)來確認(rèn)交易是否已經(jīng)成功,或者還是要進(jìn)行其它的處理,如重新執(zhí)行交易?!?br/>發(fā)明內(nèi)容】[0008]本發(fā)明實施例提供一種數(shù)據(jù)庫交易結(jié)果確認(rèn)方法,能夠在不需要確認(rèn)交易的特征數(shù)據(jù)的情況下,快速確認(rèn)客戶端的最后一次交易是否成功。[0009]本發(fā)明實施例是這樣實現(xiàn)的,一種數(shù)據(jù)庫交易結(jié)果確認(rèn)方法,所述方法包括下述步驟:[0010]生成并記錄交易唯一標(biāo)識;[0011]將所述交易唯一標(biāo)識對應(yīng)的交易語句和更新交易確認(rèn)表中的交易唯一標(biāo)識的語句作為一個交易提交給數(shù)據(jù)庫服務(wù)器;[0012]在接收數(shù)據(jù)庫服務(wù)器返回交易執(zhí)行結(jié)果的過程中發(fā)生異常時,向數(shù)據(jù)庫服務(wù)器發(fā)起交易唯一標(biāo)識查詢請求,獲取交易確認(rèn)表的交易唯一標(biāo)識;[0013]將從交易確認(rèn)表獲取的交易唯一標(biāo)識與客戶端本地記錄的交易唯一標(biāo)識進(jìn)行對t匕,判斷當(dāng)前交易是否執(zhí)行成功;[0014]所述交易確認(rèn)表配置在數(shù)據(jù)庫服務(wù)器;[0015]所述交易唯一標(biāo)識至少包括客戶端唯一標(biāo)識和成功執(zhí)行的交易的流水號。[0016]本發(fā)明實施例還提供一種數(shù)據(jù)庫交易結(jié)果確認(rèn)裝置,所述裝置包括:[0017]交易唯一標(biāo)識生成單元,用于生成并記錄交易唯一標(biāo)識;[0018]交易語句提交單元,用于將所述交易唯一標(biāo)識對應(yīng)的交易語句和更新交易確認(rèn)表中的交易唯一標(biāo)識的語句作為一個交易提交給數(shù)據(jù)庫服務(wù)器;[0019]交易唯一標(biāo)識獲取單元,用于在接收數(shù)據(jù)庫服務(wù)器返回交易執(zhí)行結(jié)果的過程中發(fā)生異常時,向數(shù)據(jù)庫服務(wù)器發(fā)起交易唯一標(biāo)識查詢請求,獲取交易確認(rèn)表的交易唯一標(biāo)識;以及[0020]交易執(zhí)行結(jié)果判斷單元,用于將從交易確認(rèn)表獲取的交易唯一標(biāo)識與客戶端本地記錄的交易唯一標(biāo)識進(jìn)行對比,判斷當(dāng)前交易是否執(zhí)行成功;[0021]所述交易確認(rèn)表配置在數(shù)據(jù)庫服務(wù)器;[0022]所述交易唯一標(biāo)識至少包括客戶端唯一標(biāo)識和成功執(zhí)行的交易的流水號。[0023]本發(fā)明實施例還提供了一種數(shù)據(jù)庫交易系統(tǒng),所述數(shù)據(jù)庫交易系統(tǒng)中包含有上述數(shù)據(jù)庫交易結(jié)果確認(rèn)裝置。[0024]本發(fā)明實施例解決了在網(wǎng)絡(luò)中斷、掉電、數(shù)據(jù)庫宕等異常條件下,客戶端不需要查詢交易的特征數(shù)據(jù),就可以快速確認(rèn)最后一次交易是否成功,從而實現(xiàn)交易自動沖正功能和大批量數(shù)據(jù)的斷點(diǎn)處理功能,尤其適用于平臺級軟件和大批量數(shù)據(jù)的處理。【附圖說明】[0025]圖1是本發(fā)明實施例提供的數(shù)據(jù)庫交易結(jié)果確認(rèn)方法的實現(xiàn)流程圖;[0026]圖2是本發(fā)明實施例提供的數(shù)據(jù)庫交易結(jié)果確認(rèn)裝置的結(jié)構(gòu)圖?!揪唧w實施方式】[0027]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。[0028]在本發(fā)明實施例中,在數(shù)據(jù)庫服務(wù)器上配置一個交易確認(rèn)表,該交易確認(rèn)表中記錄最后一次成功執(zhí)行的交易唯一標(biāo)識。當(dāng)發(fā)生異常時,客戶端查詢數(shù)據(jù)庫服務(wù)器的交易確認(rèn)表,根據(jù)交易確認(rèn)表記錄的交易唯一標(biāo)識判斷交易是否成功執(zhí)行。[0029]作為本發(fā)明的一個實施例,交易唯一標(biāo)識至少包括如下信息:[0030]1.客戶端唯一標(biāo)識,用來唯一標(biāo)識一個客戶端。[0031]作為本發(fā)明的一個實施例,一個客戶端可以對應(yīng)一個交易確認(rèn)表。[0032]作為本發(fā)明的另一個實施例,多個客戶端可以使用一個交易確認(rèn)表,不同的客戶端在該交易確認(rèn)表中具有不同的標(biāo)識。[0033]2.成功執(zhí)行的交易的流水號,用來唯一標(biāo)識一個成功執(zhí)行的交易。[0034]在本發(fā)明實施例中,成功執(zhí)行的交易的流水號可以是按照順序累計的數(shù)字序列,也可以是用戶自行定義的標(biāo)識,例如“20131115080531001”,標(biāo)識2013年11月15日08時05分31秒成功執(zhí)行的001號交易。[0035]作為本發(fā)明的一個實施例,根據(jù)實際需要,交易唯一標(biāo)識還可以包含交易的其他信息,例如用來標(biāo)識客戶端發(fā)起的交易的類型的交易類型標(biāo)識。[0036]在本發(fā)明實施例中,交易唯一標(biāo)識中的不同標(biāo)識信息,例如客戶端唯一標(biāo)識、成功執(zhí)行的交易的流水號可以分別記錄在交易確認(rèn)表中的不同字段中,也可以將它們組合記錄到交易確認(rèn)表中一個或者多個字段中。[0037]本發(fā)明實施例中,交易確認(rèn)表可以由用戶手工在數(shù)據(jù)庫服務(wù)器端配置,或者由客戶端自動在數(shù)據(jù)庫服務(wù)器上配置。配置完成后,初始化交易確認(rèn)表的交易唯一標(biāo)識。[0038]圖1示出了本發(fā)明實施例提供的數(shù)據(jù)庫交易結(jié)果確認(rèn)方法的實現(xiàn)流程,詳述如下:[0039]在步驟SlOl中,生成并記錄交易唯一標(biāo)識;[0040]在步驟S102中,將該交易唯一標(biāo)識對應(yīng)的交易語句和更新交易確認(rèn)表中的交易唯一標(biāo)識的語句作為一個交易提交給數(shù)據(jù)庫服務(wù)器;[0041]更新交易唯一標(biāo)識的語句用偽碼表示的示例如下:[0042]update交易確認(rèn)表set交易唯一標(biāo)識=’當(dāng)前交易唯一標(biāo)識’where客戶端唯一標(biāo)識=’客戶端ID’[0043]交易執(zhí)行成功后,數(shù)據(jù)庫服務(wù)器將交易確認(rèn)表中的交易唯一標(biāo)識更新。如果交易沒有執(zhí)行成功,則交易唯一標(biāo)識不會更新。[0044]在步驟S103中,在接收數(shù)據(jù)庫服務(wù)器返回交易執(zhí)行結(jié)果的過程中發(fā)生異常時,向數(shù)據(jù)庫服務(wù)器發(fā)起交易唯一標(biāo)識查詢請求,獲取交易確認(rèn)表的交易唯一標(biāo)識;[0045]在本發(fā)明實施例中,如果數(shù)據(jù)庫服務(wù)器向客戶端返回交易執(zhí)行結(jié)果的過程中發(fā)生異常,例如網(wǎng)絡(luò)中斷時,在客戶端恢復(fù)與數(shù)據(jù)庫服務(wù)器的連接后,向數(shù)據(jù)庫服務(wù)器發(fā)起交易唯一標(biāo)識查詢請求,獲取交易確認(rèn)表的交易唯一標(biāo)識。[0046]交易唯一標(biāo)識查詢請求用偽碼表示的示例如下:[0047]select交易唯一標(biāo)識from交易確認(rèn)表where客戶端唯一標(biāo)識=’客戶端ID’[0048]在步驟S104中,將從交易確認(rèn)表獲取的交易唯一標(biāo)識與客戶端本地記錄的交易唯一標(biāo)識進(jìn)行對比,判斷當(dāng)前交易是否執(zhí)行成功。[0049]以下以實際應(yīng)用場景來說明以上的處理流程:[0050]場景一:[0051]轉(zhuǎn)賬交易是銀行核心業(yè)務(wù)系統(tǒng)中的一個常見交易。假設(shè)一個賬號A向另外一個賬戶B發(fā)起一筆轉(zhuǎn)賬,轉(zhuǎn)賬的金額為100,賬戶表名為TabAcc,其中賬戶名字段為AccNameJfe戶余額字段為AccBalance。[0052]在本發(fā)明實施例中,賦予轉(zhuǎn)賬交易的簡稱為TransAcc。客戶端的應(yīng)用程序在數(shù)據(jù)庫服務(wù)器上配置交易確認(rèn)表,并初始化交易確認(rèn)表。[0053]建表語句示例如下:[0054]CreatetableQueryConfirmTab([0055]ClientIdint,//客戶端ID[0056]TxnNamevarchar(20),//交易簡稱[0057]TxnExecNumint//已經(jīng)成功執(zhí)行的交易的流水號);[0058]客戶端的應(yīng)用程序在每個交易提交前,生成并記錄交易的交易唯一標(biāo)識。交易唯一標(biāo)識由Clientld+TxnExecNum構(gòu)成,格式為:ClientId—TxnExecNum。[0059]TxnName的初始值為null;TxnExecNum的初始值為0,對于本場景中第一個轉(zhuǎn)賬交易為TransAcc_l;ClientId為I。[0060]客戶端開始發(fā)起轉(zhuǎn)賬交易,交易語句中包含更新交易確認(rèn)表的語句,示例如下:[0061]begin;[0062]updateTabAccSetTabBalance=TabBalance-1OOwhereTabAcc=’A’;[0063]updateTabAccSetTabBalance=TabBalance+100whereTabAcc=’B’;[0064]updateQueryConfirmTabSetTxnName='TransAcci,TxnExecNum=I[0065]whereClientId=I;[0066]commit;[0067]如果數(shù)據(jù)庫服務(wù)器向客戶端正常返回上述交易的執(zhí)行結(jié)果,客戶端無須任何特殊處理。[0068]如果出現(xiàn)異常,數(shù)據(jù)庫服務(wù)器沒有向客戶端返回上述交易的執(zhí)行結(jié)果,則客戶端需要執(zhí)行命令,確認(rèn)交易執(zhí)行結(jié)果。語句示例如下:[0069]selectTxnName,TxnExec當(dāng)前第1頁1 2