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