新聞中心
挖掘使用ADO.NET分布式事務(wù)登記
作者:佚名 2009-11-12 14:32:21
開(kāi)發(fā)
后端
分布式 這里就使用 System.Transactions、自動(dòng)在A(yíng)DO.NET分布式事務(wù)中登記、手動(dòng)在A(yíng)DO.NET分布式事務(wù)中登記三方面做出了詳細(xì)的介紹,希望對(duì)大家有幫助。

創(chuàng)新互聯(lián)建站是一家專(zhuān)注于成都網(wǎng)站制作、成都做網(wǎng)站與策劃設(shè)計(jì),福鼎網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:福鼎等地區(qū)。福鼎做網(wǎng)站價(jià)格咨詢(xún):18982081108
ADO.NET經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶(hù)都很了解ADO.NET分布式事務(wù)了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。事務(wù)是一組相關(guān)的任務(wù),作為獨(dú)立于其他任務(wù)的獨(dú)立單元成功(提交)或失?。ㄖ兄梗?。分布式事務(wù)是影響多個(gè)資源的事務(wù)。要提交分布式事務(wù),所有參與者都必須保證對(duì)數(shù)據(jù)的任何更改是永久的。不論系統(tǒng)崩潰或是發(fā)生其他無(wú)法預(yù)料的事件,更改都必須是持久的。即使只有一個(gè)參與者無(wú)法保證這一點(diǎn),整個(gè)事務(wù)也將失敗,在事務(wù)范圍內(nèi)對(duì)數(shù)據(jù)的任何更改均將回滾。如果 DataReader 在事務(wù)處于活動(dòng)狀態(tài)時(shí)啟動(dòng),此時(shí)若嘗試提交或回滾事務(wù),將會(huì)引發(fā)異常。
使用 System.Transactions
在 .NET Framework 中,分布式事務(wù)通過(guò) System.Transactions 命名空間中的 API 進(jìn)行管理。如果涉及多個(gè)永久資源管理器,System.Transactions API 會(huì)將分布式事務(wù)處理委托給事務(wù)監(jiān)視器,例如 Microsoft 分布式事務(wù)協(xié)調(diào)程序 (MS DTC)。有關(guān)更多信息,請(qǐng)參見(jiàn)事務(wù)基礎(chǔ)知識(shí)。
ADO.NET 2.0 引入了對(duì)使用 EnlistTransaction 方法在分布式事務(wù)中進(jìn)行登記的支持,該方法會(huì)登記 Transaction 實(shí)例中的連接。在以前版本的 ADO.NET 中,分布式事務(wù)中的顯式登記使用連接的 EnlistDistributedTransaction 方法執(zhí)行,以登記 ITransaction 實(shí)例中的連接,為了向后兼容,也支持該方法。有關(guān)企業(yè)服務(wù)事務(wù)的更多信息,請(qǐng)參見(jiàn) 與企業(yè)服務(wù)和 COM+ 事務(wù)的互操作性。
在對(duì) SQL server 2005 數(shù)據(jù)庫(kù)使用 SQL Server .NET Framework 提供程序提供的 System.Transactions 事務(wù)時(shí),將自動(dòng)使用輕型 Transaction。該事務(wù)可以根據(jù)需要提升為完全分布式事務(wù)。有關(guān)更多信息,請(qǐng)參見(jiàn)SQL Server 的 System.Transactions 集成 (ADO.NET)。默認(rèn)情況下,Oracle 數(shù)據(jù)庫(kù)可以同時(shí)參與的分布式事務(wù)的最大數(shù)目設(shè)置為 10。第 10 個(gè)事務(wù)之后,連接到 Oracle 數(shù)據(jù)庫(kù)時(shí)將會(huì)引發(fā)異常。Oracle 不支持分布式事務(wù)內(nèi)的 DDL。
自動(dòng)在A(yíng)DO.NET分布式事務(wù)中登記
自動(dòng)登記是將 ADO.NET 連接與 System.Transactions 集成的默認(rèn)(和首選)方法。如果連接對(duì)象確定事務(wù)處于活動(dòng)狀態(tài),用 System.Transaction 術(shù)語(yǔ)來(lái)說(shuō)是指 Transaction.Current 不為 Null,則連接對(duì)象會(huì)自動(dòng)在現(xiàn)有分布式事務(wù)中登記。自動(dòng)事務(wù)登記在連接打開(kāi)時(shí)進(jìn)行。之后,即使在事務(wù)范圍內(nèi)執(zhí)行命令,也不會(huì)進(jìn)行自動(dòng)事務(wù)登記??梢栽诂F(xiàn)有事務(wù)中禁用自動(dòng)登記,方法是將 Enlist=false 指定為 ConnectionString 的連接字符串參數(shù),或?qū)?OLE DB Services=-7 指定為 ConnectionString 的連接字符串參數(shù)。有關(guān) Oracle 和 ODBC 連接字符串參數(shù)的更多信息,請(qǐng)參見(jiàn) ConnectionString 和 ConnectionString。
手動(dòng)在A(yíng)DO.NET分布式事務(wù)中登記
如果禁用了自動(dòng)登記或者您需要登記在連接打開(kāi)后啟動(dòng)的事務(wù),則可以使用所用提供程序的 DbConnection 對(duì)象的 EnlistTransaction 方法,在現(xiàn)有分布式事務(wù)中登記。在現(xiàn)有分布式事務(wù)中登記可以確保當(dāng)提交或回滾了事務(wù)時(shí),也提交或回滾對(duì)數(shù)據(jù)源所做作的代碼修改。
在分布式事務(wù)中登記尤其適用于為業(yè)務(wù)對(duì)象建立池連接。如果業(yè)務(wù)對(duì)象使用打開(kāi)的連接建立池連接,自動(dòng)事務(wù)登記只有在該連接打開(kāi)時(shí)才會(huì)進(jìn)行。如果使用池中的業(yè)務(wù)對(duì)象執(zhí)行多個(gè)事務(wù),則該對(duì)象的打開(kāi)連接不自動(dòng)登記在新啟動(dòng)的事務(wù)中。在這種情況下,可以對(duì)該連接禁用自動(dòng)事務(wù)登記,并使用 EnlistTransaction 在事務(wù)中登記連接。
EnlistTransaction 使用單個(gè) Transaction 類(lèi)型的參數(shù),該參數(shù)引用現(xiàn)有的事務(wù)。在調(diào)用連接的 EnlistTransaction 方法之后,所有使用該連接在數(shù)據(jù)源上進(jìn)行的修改均將加入事務(wù)中。傳遞空值將取消該連接在當(dāng)前分布式事務(wù)登記中的登記。注意,在調(diào)用 EnlistTransaction 之前連接必須打開(kāi)。在某個(gè)事務(wù)中顯式登記了連接之后,在該事務(wù)完成之前,連接將無(wú)法取消登記或在另一個(gè)事務(wù)中登記。
#T#如果連接已使用連接的 BeginTransaction 方法開(kāi)始了某個(gè)事務(wù),EnlistTransaction 將引發(fā)異常。但是,如果事務(wù)是在數(shù)據(jù)源上開(kāi)始的本地事務(wù)(例如使用 SqlCommand 顯式執(zhí)行 BEGIN TRANSACTION 語(yǔ)句),EnlistTransaction 將回滾該本地事務(wù)并根據(jù)請(qǐng)求在現(xiàn)有分布式事務(wù)中登記。您不會(huì)接收本地事務(wù)已回滾的通知,必須管理任何未使用 BeginTransaction 開(kāi)始的本地事務(wù)。如果您在 SQL Server 2005 中使用用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序 (SqlClient),那么在嘗試登記時(shí)將會(huì)引發(fā)異常。所有其他情況將無(wú)法發(fā)現(xiàn)。
名稱(chēng)欄目:挖掘使用ADO.NET分布式事務(wù)登記
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/codgogh.html


咨詢(xún)
建站咨詢(xún)
