專利名稱:實現(xiàn)內(nèi)存數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種內(nèi)存數(shù)據(jù)事務(wù)處理的方法,尤其是發(fā)生應(yīng)用程序不可控制的異常情況時,仍能自動保持內(nèi)存數(shù)據(jù)的事務(wù)完整性的方法。
背景技術(shù):
對于大型且實時性要求較高的數(shù)據(jù)庫應(yīng)用系統(tǒng),在數(shù)據(jù)的處理過程中,利用共享內(nèi)存來緩存數(shù)據(jù),以加速業(yè)務(wù)處理速度。由于內(nèi)存相比硬盤等外存在存取速度等方面的巨大優(yōu)勢,采用內(nèi)存緩存技術(shù)會極大提高業(yè)務(wù)處理速度。這種處理方法要求在數(shù)據(jù)庫事務(wù)的處理過程中,內(nèi)存中的數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)要保持一致性。
目前現(xiàn)有的實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法如下內(nèi)存與數(shù)據(jù)庫均開始事務(wù);應(yīng)用程序訪問內(nèi)存數(shù)據(jù),更新內(nèi)存中的數(shù)據(jù),并在內(nèi)存中記錄數(shù)據(jù)變更日志;當(dāng)對內(nèi)存中的數(shù)據(jù)完成業(yè)務(wù)處理后,利用內(nèi)存數(shù)據(jù)更新數(shù)據(jù)庫數(shù)據(jù);當(dāng)數(shù)據(jù)庫數(shù)據(jù)更新完成后,提交數(shù)據(jù)庫事務(wù);然后清理內(nèi)存變更日志,并提交內(nèi)存數(shù)據(jù)。
在上述過程中,應(yīng)用程序檢測到處理發(fā)生錯誤時,首先進(jìn)行數(shù)據(jù)庫事務(wù)的回退,再利用內(nèi)存變更日志回退內(nèi)存數(shù)據(jù),保證事務(wù)的完整性。
現(xiàn)有技術(shù)的缺點在現(xiàn)有技術(shù)中,事務(wù)完全由應(yīng)用程序控制,在發(fā)生應(yīng)用可控的異常時,事務(wù)可以得到較好的保證,但在發(fā)生應(yīng)用無法控制的異常時,如進(jìn)程被強行終止等,由于應(yīng)用沒有機會進(jìn)行異常處理,導(dǎo)致內(nèi)存與數(shù)據(jù)庫數(shù)據(jù)的不同步,且應(yīng)用程序自身不了解數(shù)據(jù)庫事務(wù)的完成情況,難以對異常自動處理,一般需人工干預(yù)恢復(fù)內(nèi)存與數(shù)據(jù)庫數(shù)據(jù)的同步。如果應(yīng)用是多層系統(tǒng)的中間層服務(wù),由于事務(wù)通常由客戶端控制,無法使內(nèi)存與數(shù)據(jù)庫發(fā)生不同步時自動恢復(fù)內(nèi)存數(shù)據(jù)。
發(fā)明內(nèi)容
本發(fā)明的目的是針對上述現(xiàn)有技術(shù)中實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法存在的不足,提供一種實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法,通過在事務(wù)處理過程中對內(nèi)存和數(shù)據(jù)庫的事務(wù)處理對象進(jìn)行加鎖,并記錄事務(wù)處理的流水號,使得在發(fā)生應(yīng)用程序不可控的異常時,可以根據(jù)數(shù)據(jù)庫事務(wù)的完成情況,自動的恢復(fù)內(nèi)存中的數(shù)據(jù),保持內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)的一致性。
為了實現(xiàn)上述發(fā)明目的,本發(fā)明提供了一種實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法,包括如下步驟步驟1、當(dāng)內(nèi)存和數(shù)據(jù)庫在開始事務(wù)時,對內(nèi)存和數(shù)據(jù)庫的事務(wù)處理對象加鎖;步驟2、生成本次事務(wù)的唯一事務(wù)流水號,將該流水號和事務(wù)類型記錄在內(nèi)存和數(shù)據(jù)庫的事務(wù)日志中;步驟3、對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理,并記錄內(nèi)存變更日志;步驟4、當(dāng)完成對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理后,利用內(nèi)存數(shù)據(jù)更新數(shù)據(jù)庫數(shù)據(jù);步驟5、當(dāng)數(shù)據(jù)庫數(shù)據(jù)更新完成后,在數(shù)據(jù)庫的事務(wù)日志中記錄本次數(shù)據(jù)庫事務(wù)處理成功,并解除數(shù)據(jù)庫事務(wù)處理對象的鎖;步驟6、解除內(nèi)存事務(wù)處理對象的鎖。
通過本發(fā)明提供的方法,不僅可以使內(nèi)存數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)保持同步,簡化利用內(nèi)存加快業(yè)務(wù)處理速度的應(yīng)用程序的編程復(fù)雜度,還可以在異常發(fā)生時由應(yīng)用程序自動恢復(fù)內(nèi)存數(shù)據(jù),尤其是在發(fā)生應(yīng)用程序不可控的異常時,保持內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)的一致性。
下面通過附圖和實施例,對本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。
圖1為本發(fā)明的實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法的具體實施例的流程圖。
具體實施例方式
內(nèi)存數(shù)據(jù)來源于數(shù)據(jù)庫表,為了便于內(nèi)存數(shù)據(jù)的訪問和控制,按數(shù)據(jù)類型分為鍵值表和數(shù)據(jù)表。鍵值表存放業(yè)務(wù)對象的關(guān)鍵信息,如銀行系統(tǒng)的儲蓄賬號、電信運營系統(tǒng)的用戶號等。為加快鍵值表訪問速度,可以將鍵值表組織成平衡二叉樹、哈希表、鍵樹等結(jié)構(gòu)。數(shù)據(jù)表存放業(yè)務(wù)對象對應(yīng)的各類數(shù)據(jù),通過鍵值表可快速訪問相關(guān)數(shù)據(jù)。
鍵值表如下所示
數(shù)據(jù)表結(jié)構(gòu)依據(jù)具體存儲數(shù)據(jù)而定,可以組織成單向或雙向鏈表。
參見圖1,其為本發(fā)明的實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法的具體實施例的流程圖,包括如下步驟
步驟101、當(dāng)內(nèi)存和數(shù)據(jù)庫在開始事務(wù)時,對內(nèi)存和數(shù)據(jù)庫的事務(wù)處理對象加鎖;其中事務(wù)處理對象為數(shù)據(jù)的關(guān)鍵信息,例如如銀行的儲蓄帳號和電信運營商的交費帳號等,并且事務(wù)鎖是獨占性的。
步驟102、生成本次事務(wù)的唯一事務(wù)流水號,將該流水號和事務(wù)類型記錄在內(nèi)存和數(shù)據(jù)庫的事務(wù)日志中;步驟103、對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理,并記錄內(nèi)存變更日志;步驟104、當(dāng)完成對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理后,利用內(nèi)存數(shù)據(jù)更新數(shù)據(jù)庫數(shù)據(jù);步驟105、當(dāng)數(shù)據(jù)庫數(shù)據(jù)更新完成后,在數(shù)據(jù)庫的事務(wù)日志中記錄本次數(shù)據(jù)庫事務(wù)處理成功,并解除數(shù)據(jù)庫事務(wù)處理對象的鎖;步驟106、解除內(nèi)存事務(wù)處理對象的鎖。在解除內(nèi)存事務(wù)處理對象的鎖后還可以包括清理內(nèi)存變更日志的操作。
如果在上述的事務(wù)處理的過程中,在應(yīng)用程序可控的范圍內(nèi)發(fā)生異常,如更新數(shù)據(jù)庫失敗等,則內(nèi)存應(yīng)用根據(jù)內(nèi)存數(shù)據(jù)變更日志恢復(fù)內(nèi)存中的數(shù)據(jù),并利用數(shù)據(jù)庫事務(wù)回滾機制恢復(fù)數(shù)據(jù)庫數(shù)據(jù)。
如果在應(yīng)用程序未知或不可控范圍內(nèi)發(fā)生異常,如進(jìn)程被強行終止等,當(dāng)該事務(wù)處理對象再次接受業(yè)務(wù)處理而進(jìn)行加鎖時,如果對數(shù)據(jù)庫的事務(wù)處理對象加鎖失敗,表示事務(wù)處理對象正在被其他事務(wù)處理,則等待一定時間后重試加鎖或報加鎖失敗返回。重試加鎖成功則繼續(xù)進(jìn)行事務(wù)處理。
如果內(nèi)存的事務(wù)處理對象加鎖失敗,則利用內(nèi)存中記錄的上次事務(wù)類型和事務(wù)流水號,查詢數(shù)據(jù)庫業(yè)務(wù)日志上次事務(wù)處理的日志,判斷上次數(shù)據(jù)庫的事務(wù)處理是否成功,如果上次數(shù)據(jù)庫的事務(wù)處理成功,則表示上次內(nèi)存數(shù)據(jù)處理成功完成,對內(nèi)存事務(wù)處理對象重新加鎖,然后繼續(xù)進(jìn)行事務(wù)處理;如果上次數(shù)據(jù)庫事務(wù)處理失敗,則表示內(nèi)存中數(shù)據(jù)有與數(shù)據(jù)庫中的數(shù)據(jù)不一致的可能性,利用數(shù)據(jù)庫中的數(shù)據(jù)恢復(fù)內(nèi)存中的數(shù)據(jù),恢復(fù)后對所述內(nèi)存的事務(wù)處理對象重新加鎖,繼續(xù)進(jìn)行事務(wù)處理。
本發(fā)明具有如下有益效果
減少了現(xiàn)有技術(shù)中必須的內(nèi)存提交步驟,保證了內(nèi)存和數(shù)據(jù)庫數(shù)據(jù)的一致性。并能在異常發(fā)生時,由內(nèi)存應(yīng)用自動重新同步內(nèi)存和數(shù)據(jù)庫的數(shù)據(jù),尤其是在發(fā)生應(yīng)用程序不可控的異常時,保持內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)的一致性。而其他利用內(nèi)存應(yīng)用的應(yīng)用程序無需對內(nèi)存事務(wù)進(jìn)行任何附加處理,從而實現(xiàn)內(nèi)存事務(wù)的透明管理,擴(kuò)展了內(nèi)存緩存技術(shù)的適用領(lǐng)域。
最后所應(yīng)說明的是,以上實施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實施例對本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍。
權(quán)利要求
1.一種實現(xiàn)內(nèi)存數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法,其特征在于包括如下步驟步驟1、當(dāng)內(nèi)存和數(shù)據(jù)庫在開始事務(wù)時,對內(nèi)存和數(shù)據(jù)庫的事務(wù)處理對象加鎖;步驟2、生成本次事務(wù)的唯一事務(wù)流水號,將該流水號和事務(wù)類型記錄在內(nèi)存和數(shù)據(jù)庫的事務(wù)日志中;步驟3、對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理,并記錄內(nèi)存變更日志;步驟4、當(dāng)完成對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理后,利用內(nèi)存數(shù)據(jù)更新數(shù)據(jù)庫數(shù)據(jù);步驟5、當(dāng)數(shù)據(jù)庫數(shù)據(jù)更新完成后,在數(shù)據(jù)庫的事務(wù)日志中記錄本次數(shù)據(jù)庫事務(wù)處理成功,并解除數(shù)據(jù)庫事務(wù)處理對象的鎖;步驟6、解除內(nèi)存事務(wù)處理對象的鎖。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于在所述步驟6中,在解除內(nèi)存事務(wù)處理對象的鎖后還包括清理內(nèi)存變更日志的操作。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于如果在事務(wù)處理的過程中,在應(yīng)用程序可控的范圍內(nèi)發(fā)生異常,則根據(jù)內(nèi)存數(shù)據(jù)變更日志恢復(fù)內(nèi)存中的數(shù)據(jù),并利用數(shù)據(jù)庫事務(wù)回滾機制恢復(fù)數(shù)據(jù)庫數(shù)據(jù)。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于如果對數(shù)據(jù)庫的事務(wù)處理對象加鎖失敗,則等待后重試加鎖或報加鎖失敗返回。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于在所述步驟1中,如果內(nèi)存的事務(wù)處理對象加鎖失敗,則利用內(nèi)存中記錄的上次事務(wù)類型和事務(wù)流水號,查詢數(shù)據(jù)庫業(yè)務(wù)日志上次事務(wù)處理的日志,判斷上次數(shù)據(jù)庫的事務(wù)處理是否成功,如果上次數(shù)據(jù)庫的事務(wù)處理成功,則對所述內(nèi)存的事務(wù)處理對象重新加鎖,然后繼續(xù)進(jìn)行事務(wù)處理;如果上次數(shù)據(jù)庫事務(wù)處理失敗,則利用數(shù)據(jù)庫中的數(shù)據(jù)恢復(fù)內(nèi)存中的數(shù)據(jù),恢復(fù)后對所述內(nèi)存的事務(wù)處理對象重新加鎖,繼續(xù)進(jìn)行事務(wù)處理。
全文摘要
本發(fā)明涉及一種實現(xiàn)內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)事務(wù)一致性的處理方法,包括1.當(dāng)內(nèi)存和數(shù)據(jù)庫在開始事務(wù)時,對內(nèi)存和數(shù)據(jù)庫的事務(wù)處理對象加鎖;2.生成本次事務(wù)的唯一事務(wù)流水號,將該流水號和事務(wù)類型記錄在內(nèi)存和數(shù)據(jù)庫的事務(wù)日志中;3.對內(nèi)存中的數(shù)據(jù)進(jìn)行事務(wù)處理,并記錄內(nèi)存變更日志;4.利用內(nèi)存數(shù)據(jù)更新數(shù)據(jù)庫數(shù)據(jù);5.在數(shù)據(jù)庫的事務(wù)日志中記錄本次數(shù)據(jù)庫事務(wù)處理成功,并解除數(shù)據(jù)庫事務(wù)處理對象的鎖;6.解除內(nèi)存事務(wù)處理對象的鎖。通過本發(fā)明提供的方法,簡化了利用內(nèi)存加快業(yè)務(wù)處理速度的應(yīng)用程序的復(fù)雜度,并在異常發(fā)生時由應(yīng)用程序自動恢復(fù)內(nèi)存數(shù)據(jù),尤其是在發(fā)生應(yīng)用程序不可控的異常時,保持內(nèi)存數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)的一致性。
文檔編號G06F9/46GK1858745SQ20061006638
公開日2006年11月8日 申請日期2006年4月5日 優(yōu)先權(quán)日2006年4月5日
發(fā)明者尹春雷, 遲峻峰 申請人:華為技術(shù)有限公司