專利名稱::智能啟用分布式事務(wù)的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種計算機(jī)技術(shù),具體地說是一種智能啟用分布式事務(wù)的方法。
背景技術(shù):
:事務(wù)提供一種機(jī)制將一個活動涉及的所有操作納入到一個不可分割的執(zhí)行單元,組成事務(wù)的所有操作只有在所有操作均能正常執(zhí)行的情況下方能提交,只要其中任一操作執(zhí)行失敗,都將導(dǎo)致整個事務(wù)的回滾。對于一個分布式事務(wù)(DistributedTransaction)來講,事務(wù)的參與者分布于網(wǎng)絡(luò)環(huán)境中的不同的節(jié)點。參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上。由于分布式事務(wù)的邏輯更加復(fù)雜,涉及到更多組件。微軟.NET框架對分布式事務(wù)提供了支持,包括顯式事務(wù)、隱式事務(wù)、顯式分布式事務(wù)、隱式分布式事務(wù)。微軟的分布式事務(wù)基于MSDTC組件。該組件的穩(wěn)定性、可用性受環(huán)境影響程度較高。在一個業(yè)務(wù)軟件系統(tǒng)中,包含許多業(yè)務(wù)組件,在運行期,這些業(yè)務(wù)組件可以對應(yīng)不同的數(shù)據(jù)訪問層組件實例。在一個業(yè)務(wù)處理中,這些業(yè)務(wù)組件按照一定的流程進(jìn)行編排。這樣多個數(shù)據(jù)訪問層實例就需要協(xié)同工作,保證數(shù)據(jù)的完整、一致。要實現(xiàn)這個目標(biāo),數(shù)據(jù)庫本地事務(wù)就無法滿足需求。因為每個組件都處于一個“隱式”的調(diào)用環(huán)境中,組件的數(shù)據(jù)訪問層不能與特定的調(diào)用場景耦合。因此必須采用分布式事務(wù)才能達(dá)到目標(biāo)。這樣,就帶來一個問題如果所有的組件的訪問層都與同一個數(shù)據(jù)庫通訊,那么實際的分布式事務(wù)可以簡化為數(shù)據(jù)庫、應(yīng)用服務(wù)器兩個參與者。TransactionScope在文檔中宣稱只在“必要”情況下才提升事務(wù)級別(多數(shù)據(jù)庫時才使用分布式事務(wù),如果是同一個數(shù)據(jù)庫,最好使用SqlTransaction),但是事實上不是這樣。在TransactionScope內(nèi),只要你用不同的SqlConnection對象操作DB—次以上(不管你的目標(biāo)是不是同一個實例、同一個庫),都會提升事務(wù)級別到分布式事務(wù),無疑會大大增加系統(tǒng)負(fù)擔(dān),降低服務(wù)器性能。
發(fā)明內(nèi)容本發(fā)明的技術(shù)任務(wù)是針對上述現(xiàn)有技術(shù)的不足,提供智能啟用分布式事務(wù)的方法。利用該方法可以有效解決在單數(shù)據(jù)庫場景下,因為使用分布式事務(wù)而帶來的配置、部署的復(fù)雜性,并提升系統(tǒng)性能。本發(fā)明的技術(shù)任務(wù)是按以下方式實現(xiàn)的智能啟用分布式事務(wù)的方法,對微軟.NET的分布式事務(wù)接口進(jìn)行透明封裝,多個數(shù)據(jù)訪問層協(xié)同工作時,如果后臺數(shù)據(jù)庫為同一實例時,自動啟用數(shù)據(jù)庫事務(wù),若是多個數(shù)據(jù)庫實例,則自動啟用分布式事務(wù),并且把已經(jīng)啟用的數(shù)據(jù)庫事務(wù)與分布式事務(wù)融合。上述方法的具體實現(xiàn)方法包含數(shù)據(jù)庫連接管理及分布式事務(wù)代理兩部分。I)數(shù)據(jù)庫連接管理實現(xiàn)一個數(shù)據(jù)庫連接工廠GSF1DatabaseFactory,以數(shù)據(jù)庫連接工廠GSPDatabaseFactory實現(xiàn)對數(shù)據(jù)源創(chuàng)建的管理,倉ll建數(shù)據(jù)庫連接成功后放入內(nèi)部連接池;數(shù)據(jù)庫連接工廠GSF1DatabaseFactory根據(jù)連接字符串形成連接信息字段列表,再根據(jù)當(dāng)前線程上下文Token形成一個索引值,根據(jù)這個索引值在內(nèi)部連接池中檢索可用的數(shù)據(jù)庫連接;數(shù)據(jù)庫連接工廠GSF1DatabaseFactory的GetDatabase方法返回一個接口IGSPDatabase有執(zhí)行SQL語句的接口方法和開啟、關(guān)閉數(shù)據(jù)庫的方法,在不啟用分布式事務(wù)的情況下,由數(shù)據(jù)庫連接工廠GSF1DatabaseFactory智能管理數(shù)據(jù)庫連接的開啟和關(guān)閉;2)分布式事務(wù)代理實現(xiàn)一個虛擬分布式事務(wù)協(xié)調(diào)器=VirtualDTC,初次調(diào)用下述代碼,初始化當(dāng)前調(diào)用上下文中的虛擬分布式事務(wù)作用域,VirtualTransactionScopescopel=newVirtualTransactionScope(TransactionScopeOption.Required);當(dāng)前調(diào)用堆棧繼續(xù)調(diào)用上面代碼,根據(jù)TransactionScopeOption參數(shù)的值來確定虛擬分布式事務(wù)如何融合,虛擬分布式事務(wù)協(xié)調(diào)器記錄當(dāng)前管理的數(shù)據(jù)庫連接,如果后續(xù)創(chuàng)建的數(shù)據(jù)庫連接與連接池中的連接信息相同,則直接使用連接池中的連接,接著比較當(dāng)前正在使用的數(shù)據(jù)庫連接是否就是匹配的連接如果相同,并且事務(wù)屬性是Required,則前后兩次數(shù)據(jù)庫連接進(jìn)行合并,并且增加引用計數(shù);外部調(diào)用代碼后續(xù)試圖關(guān)閉數(shù)據(jù)庫時,由數(shù)據(jù)庫連接管理器負(fù)責(zé)減少引用計數(shù);如果連接信息相同,但是事務(wù)屬性是RequiredNew,則內(nèi)部創(chuàng)建一個顯式的分布式事務(wù),并且把管理的內(nèi)部數(shù)據(jù)庫連接登記到該顯式事務(wù)中;如果與堆棧上連接信息不同,則直接啟動顯式分布式事務(wù),并把現(xiàn)有數(shù)據(jù)庫連接登記到分布式事務(wù)。與現(xiàn)有技術(shù)相比,本發(fā)明的智能啟用分布式事務(wù)的方法解決了在單一數(shù)據(jù)庫的環(huán)境下,由于各個數(shù)據(jù)訪問層為了保證數(shù)據(jù)的一致,而必須使用分布式事務(wù)帶來的性能損失問題。在升級為多數(shù)據(jù)庫實例時,各個數(shù)據(jù)訪問層的事務(wù)處理無需任何修改,即可自動啟用分布式事務(wù)。這樣,在單一數(shù)據(jù)庫部署架構(gòu)下,就大大降低了對MSDTC組件的依賴,大大提高系統(tǒng)的穩(wěn)定性、可靠性。附圖I是本發(fā)明智能啟用分布式事務(wù)的方法中虛擬分布式事務(wù)的算法邏輯圖。具體實施例方式參照說明書附圖以具體實施例對本發(fā)明的智能啟用分布式事務(wù)的方法作以下詳細(xì)地說明。實施例本發(fā)明智能啟用分布式事務(wù)的方法的具體實現(xiàn)方案包括1)數(shù)據(jù)庫連接管理、2)分布式事務(wù)代理。I、數(shù)據(jù)庫連接管理。通常的數(shù)據(jù)庫連接創(chuàng)建代碼如下DBConnectionmyConnection=newSqlConnection(myConnString);本方法實現(xiàn)一個數(shù)據(jù)庫連接工廠GSF1DatabaseFactory,實現(xiàn)對數(shù)據(jù)源創(chuàng)建的管理,倉1J建數(shù)據(jù)庫連接成功后放入內(nèi)部連接池。IGSPDatabase=GSPDatabaseFactory.GetDatabase(myConnString);這個GSF1DatabaseFactory根據(jù)連接字符串形成連接信息字段列表,再根據(jù)當(dāng)前線程上下文Token形成一個索引值,根據(jù)這個索引值在內(nèi)部連接池中檢索可用的數(shù)據(jù)庫連接。工廠類GSF1DatabaseFactory的GetDatabase方法返回一個接口IGSPDatabase有執(zhí)行SQL語句的接口方法和開啟、關(guān)閉數(shù)據(jù)庫的方法。在不啟用分布式事務(wù)的情況下,由GSPDatabaseFactory智能管理數(shù)據(jù)庫連接的開啟和關(guān)閉。2、分布式事務(wù)代理。分布式事務(wù)代理實現(xiàn)一個虛擬分布式事務(wù)協(xié)調(diào)器VirtualDTC。初次在調(diào)用下面代碼,初始化當(dāng)前調(diào)用上下文中的虛擬分布式事務(wù)作用域。VirtualTransactionScopescopel=newVirtualTransactionScope(TransactionScopeOption.Required);如附圖I所示,當(dāng)前調(diào)用堆棧繼續(xù)調(diào)用上面代碼,則會根據(jù)TransactionScopeOption參數(shù)的值來確定虛擬分布式事務(wù)如何融合。虛擬分布式事務(wù)協(xié)調(diào)器記錄當(dāng)前管理的數(shù)據(jù)庫連接,如果后續(xù)創(chuàng)建的數(shù)據(jù)庫連接與連接池中的連接信息相同,則直接使用連接池中的連接,接著比較當(dāng)前正在使用的數(shù)據(jù)庫連接是否就是匹配的連接如果相同,并且事務(wù)屬性是Required,則前后兩次數(shù)據(jù)庫連接進(jìn)行合并,并且增加引用計數(shù)。外部調(diào)用代碼后續(xù)試圖關(guān)閉數(shù)據(jù)庫時,由數(shù)據(jù)庫連接管理器負(fù)責(zé)減少引用計數(shù);如果連接信息相同,但是事務(wù)屬性是RequiredNew,則內(nèi)部創(chuàng)建一個顯式的分布式事務(wù);CommittableTransactionInternaltran=newCommittableTransaction();并且調(diào)用下面代碼把管理的內(nèi)部數(shù)據(jù)庫連接登記到該顯式事務(wù)中InternalLocalconn.EnlistTransaction(Internaltran);如果與堆棧上連接信息不同,則直接采取上述方式,即啟動顯式分布式事務(wù),并把現(xiàn)有數(shù)據(jù)庫連接登記到分布式事務(wù)。權(quán)利要求1.智能啟用分布式事務(wù)的方法,其特征在于對微軟.NET的分布式事務(wù)接口進(jìn)行透明封裝,多個數(shù)據(jù)訪問層協(xié)同工作時,如果后臺數(shù)據(jù)庫為同一實例時,自動啟用數(shù)據(jù)庫事務(wù),若是多個數(shù)據(jù)庫實例,則自動啟用分布式事務(wù),并且把已經(jīng)啟用的數(shù)據(jù)庫事務(wù)與分布式事務(wù)融合。2.根據(jù)權(quán)利要求I所述的智能啟用分布式事務(wù)的方法,其特征在于具體實現(xiàn)方法包含數(shù)據(jù)庫連接管理及分布式事務(wù)代理兩部分?jǐn)?shù)據(jù)庫連接管理實現(xiàn)一個數(shù)據(jù)庫連接工廠GSF1DatabaseFactory,以數(shù)據(jù)庫連接工廠GSPDatabaseFactory實現(xiàn)對數(shù)據(jù)源創(chuàng)建的管理,倉Il建數(shù)據(jù)庫連接成功后放入內(nèi)部連接池;數(shù)據(jù)庫連接工廠GSF1DatabaseFactory根據(jù)連接字符串形成連接信息字段列表,再根據(jù)當(dāng)前線程上下文Token形成一個索引值,根據(jù)這個索引值在內(nèi)部連接池中檢索可用的數(shù)據(jù)庫連接;數(shù)據(jù)庫連接工廠GSF1DatabaseFactory的GetDatabase方法返回一個接口IGSPDatabase有執(zhí)行SQL語句的接口方法和開啟、關(guān)閉數(shù)據(jù)庫的方法,在不啟用分布式事務(wù)的情況下,由數(shù)據(jù)庫連接工廠GSF1DatabaseFactory智能管理數(shù)據(jù)庫連接的開啟和關(guān)閉;分布式事務(wù)代理實現(xiàn)一個虛擬分布式事務(wù)協(xié)調(diào)器=VirtualDTC,初次調(diào)用下述代碼,初始化當(dāng)前調(diào)用上下文中的虛擬分布式事務(wù)作用域,VirtualTransactionScopescopel=newVirtualTransactionScope(TransactionScopeOption.Required);當(dāng)前調(diào)用堆棧繼續(xù)調(diào)用上述代碼,根據(jù)TransactionScopeOption參數(shù)的值來確定虛擬分布式事務(wù)如何融合,虛擬分布式事務(wù)協(xié)調(diào)器記錄當(dāng)前管理的數(shù)據(jù)庫連接,如果后續(xù)創(chuàng)建的數(shù)據(jù)庫連接與連接池中的連接信息相同,則直接使用連接池中的連接,接著比較當(dāng)前正在使用的數(shù)據(jù)庫連接是否就是匹配的連接如果相同,并且事務(wù)屬性是Required,則前后兩次數(shù)據(jù)庫連接進(jìn)行合并,并且增加引用計數(shù);外部調(diào)用代碼后續(xù)試圖關(guān)閉數(shù)據(jù)庫時,由數(shù)據(jù)庫連接管理器負(fù)責(zé)減少引用計數(shù);如果連接信息相同,但是事務(wù)屬性是RequiredNew,則內(nèi)部創(chuàng)建一個顯式的分布式事務(wù),并且把管理的內(nèi)部數(shù)據(jù)庫連接登記到該顯式事務(wù)中;如果與堆棧上連接信息不同,則直接啟動顯式分布式事務(wù),并把現(xiàn)有數(shù)據(jù)庫連接登記到分布式事務(wù)。全文摘要本發(fā)明公開了一種智能啟用分布式事務(wù)的方法,屬于計算機(jī)領(lǐng)域。該方法對微軟NET的分布式事務(wù)接口進(jìn)行透明封裝,多個數(shù)據(jù)訪問層協(xié)同工作時,如果后臺數(shù)據(jù)庫為同一實例時,自動啟用數(shù)據(jù)庫事務(wù),若是多個數(shù)據(jù)庫實例,則自動啟用分布式事務(wù),并且把已經(jīng)啟用的數(shù)據(jù)庫事務(wù)與分布式事務(wù)融合。與現(xiàn)有技術(shù)相比,本發(fā)明的智能啟用分布式事務(wù)的方法具有結(jié)構(gòu)清晰、應(yīng)用方便、兼容標(biāo)準(zhǔn)事務(wù)接口等特點,廣泛應(yīng)用于分布式數(shù)據(jù)訪問架構(gòu)之中,具有很好的推廣應(yīng)用價值。文檔編號G06F17/30GK102945264SQ201210408530公開日2013年2月27日申請日期2012年10月24日優(yōu)先權(quán)日2012年10月24日發(fā)明者趙啟杰申請人:浪潮集團(tuán)山東通用軟件有限公司