小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

事務(wù)處理

 kittywei 2011-10-10
1.事務(wù)處理基本原理
事務(wù)是一組作為一個(gè)單元成功或失敗的相關(guān)任務(wù)。在事務(wù)處理術(shù)語(yǔ)中,事務(wù)要么提交,要么中止。若要提交事務(wù),所有參與者都必須保證對(duì)數(shù)據(jù)的任何更改是永久的。不論系統(tǒng)崩潰或是發(fā)生其他無(wú)法預(yù)料的事件,更改都必須是持久的。
只要有一個(gè)參與者無(wú)法做出此保證,整個(gè)事務(wù)就會(huì)失敗。事務(wù)范圍內(nèi)的所有數(shù)據(jù)更改將回滾到特定設(shè)置點(diǎn)。
事務(wù)將多個(gè)任務(wù)綁定在一起。例如,假設(shè)某個(gè) ASP.NET 頁(yè)執(zhí)行兩個(gè)任務(wù)。它首先在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)新表。接著調(diào)用專用對(duì)象收集和格式化數(shù)據(jù),并在新表中插入數(shù)據(jù)。這兩個(gè)任務(wù)是相關(guān)甚至相互依賴的,因此除非可用數(shù)據(jù)填充表,否則應(yīng)避免創(chuàng)建新表。在一個(gè)事務(wù)范圍內(nèi)執(zhí)行兩個(gè)任務(wù)會(huì)加強(qiáng)兩者之間的關(guān)系。如果第二個(gè)任務(wù)失敗,則第一個(gè)任務(wù)回滾到創(chuàng)建新表前的點(diǎn)。
如此例所示,可將事務(wù)限制到一個(gè)數(shù)據(jù)資源,如數(shù)據(jù)庫(kù)或消息隊(duì)列。這些數(shù)據(jù)資源通常提供本地事務(wù)功能。這些事務(wù)由數(shù)據(jù)資源控制,管理起來(lái)輕松高效。
事務(wù)還可以跨越多個(gè)數(shù)據(jù)資源。分布式事務(wù)使您得以將出現(xiàn)在不同系統(tǒng)上的若干不同操作合并為單個(gè)的成功或失敗操作。
 
2.ACID 屬性
ACID 一詞表達(dá)了事務(wù)在使命關(guān)鍵的應(yīng)用程序中所起的作用。ACID 是由事務(wù)處理先驅(qū)者創(chuàng)立的,代表了不可分性、一致性、隔離性和持續(xù)性。
這些屬性確??深A(yù)知行為的安全性,加強(qiáng)了事務(wù)作為“全或無(wú)”命題的作用,而此命題旨在有很多變量時(shí)減少管理負(fù)荷。

不可分性

事務(wù)是一個(gè)工作單元,在其中應(yīng)用程序的 BEGIN TRANSACTION 和 END TRANSACTION 語(yǔ)句之間發(fā)生一系列操作。事務(wù)只執(zhí)行一次,且是不可分的,即完成全部工作或者不做任何工作。
與某個(gè)事務(wù)關(guān)聯(lián)的操作通常具有共同的目標(biāo),并且是相互依賴的。如果系統(tǒng)只執(zhí)行這些操作的一個(gè)子集,則可能會(huì)破壞事務(wù)的總體目標(biāo)。不可分性消除了系統(tǒng)處理操作子集的可能性。
 
一致性
 
事務(wù)是一個(gè)完整的單元,因?yàn)樗3謹(jǐn)?shù)據(jù)的一致性,將數(shù)據(jù)從一種數(shù)據(jù)一致?tīng)顟B(tài)轉(zhuǎn)換到另一種數(shù)據(jù)一致?tīng)顟B(tài)。
一致性要求在語(yǔ)義上保留事務(wù)綁定的數(shù)據(jù)。某些維護(hù)一致性的責(zé)任由應(yīng)用程序開(kāi)發(fā)人員承擔(dān),他們必須確保應(yīng)用程序已強(qiáng)制所有已知的完整性約束。例如,當(dāng)開(kāi)發(fā)用于轉(zhuǎn)帳的應(yīng)用程序時(shí),應(yīng)避免在轉(zhuǎn)帳過(guò)程中任意移動(dòng)小數(shù)點(diǎn)。
 
隔離性
 
事務(wù)是一個(gè)隔離單元,允許可并行執(zhí)行的事務(wù)表現(xiàn)得像是在系統(tǒng)中運(yùn)行的唯一事務(wù)。
隔離性要求即使同時(shí)可能有其他事務(wù)正在運(yùn)行,每個(gè)事務(wù)也像是操作數(shù)據(jù)存儲(chǔ)區(qū)的唯一事務(wù)一樣。事務(wù)應(yīng)從不查看其他事務(wù)的中間階段。
當(dāng)事務(wù)可序列化時(shí)將獲得最高的隔離級(jí)別。在此級(jí)別上,從一組可并行執(zhí)行的事務(wù)獲得的結(jié)果與通過(guò)連續(xù)運(yùn)行每個(gè)事務(wù)所獲得的結(jié)果相同。由于高度隔離會(huì)限制可并行執(zhí)行的事務(wù)數(shù),所以一些應(yīng)用程序降低隔離級(jí)別以換取更大的吞吐量。
 
持續(xù)性
 
事務(wù)也是一個(gè)恢復(fù)單元。如果事務(wù)成功,則即使在提交后計(jì)算機(jī)立即崩潰,系統(tǒng)仍將保證更新該事務(wù)。專用記錄允許系統(tǒng)的重新啟動(dòng)過(guò)程完成未完成的操作,以使事務(wù)可持續(xù)。
 
3.事務(wù)邊界
事務(wù)邊界定義事務(wù)的范圍。事務(wù)邊界內(nèi)的對(duì)象共享一個(gè)公共事務(wù)標(biāo)識(shí)符。
事務(wù)執(zhí)行時(shí),各種事務(wù)識(shí)別資源可以參與事務(wù)。例如,如果在事務(wù)范圍內(nèi)應(yīng)用程序連接到數(shù)據(jù)庫(kù),則事務(wù)流向此資源并擴(kuò)展事務(wù)邊界以包含數(shù)據(jù)庫(kù)服務(wù)器??梢栽O(shè)計(jì)跨越進(jìn)程和計(jì)算機(jī)的事務(wù)。因此,事務(wù)邊界是表示管理跨進(jìn)程邊界和計(jì)算機(jī)邊界的一致性的抽象概念。
對(duì)事務(wù)邊界的控制取決于為應(yīng)用程序選擇的事務(wù)模型:手動(dòng)或自動(dòng)。在手動(dòng)事務(wù)中,用開(kāi)始和結(jié)束事務(wù)的顯式指令控制事務(wù)邊界。從一個(gè)事務(wù)邊界內(nèi)可以開(kāi)始第二個(gè)被稱為嵌套事務(wù)的事務(wù)。直到所有從屬事務(wù)提交,其父事務(wù)才提交。
自動(dòng)事務(wù)基于每個(gè)組件的聲明特性集管理事務(wù)邊界。事務(wù)自動(dòng)流向被指示參與事務(wù)的對(duì)象,并跳過(guò)被指示在事務(wù)外部執(zhí)行的對(duì)象。使用自動(dòng)事務(wù)模型時(shí)無(wú)法嵌套事務(wù)。
 
4.分布式事務(wù)
分布式事務(wù)處理 (TP) 系統(tǒng)旨在協(xié)助在分布式環(huán)境中跨異類的事務(wù)識(shí)別資源的事務(wù)。在分布式 TP 系統(tǒng)的支持下,應(yīng)用程序可以將不同的活動(dòng)合并為一個(gè)事務(wù)性單元,這些活動(dòng)包括從 Microsoft 消息隊(duì)列 (MSMQ) 隊(duì)列檢索消息、將消息存儲(chǔ)在 Microsoft SQL Server 數(shù)據(jù)庫(kù)中、將所有現(xiàn)有的消息引用從 Oracle 服務(wù)器數(shù)據(jù)庫(kù)中移除,等等。因?yàn)榉植际绞聞?wù)跨多個(gè)數(shù)據(jù)庫(kù)資源,故強(qiáng)制 ACID 屬性維護(hù)所有資源上的數(shù)據(jù)一致性是很重要的。
如后面各節(jié)所述,分布式 TP 系統(tǒng)由若干合作的實(shí)體組成。這些實(shí)體是邏輯上的且可駐留在同一計(jì)算機(jī)上或不同的計(jì)算機(jī)上。
 
事務(wù)處理 (TP) 監(jiān)視器
TP 監(jiān)視器是位于事務(wù)識(shí)別應(yīng)用程序和資源集合之間的軟件。它優(yōu)化操作系統(tǒng)的活動(dòng),使網(wǎng)絡(luò)通訊流暢,并將多個(gè)客戶端連接到可能訪問(wèn)多個(gè)數(shù)據(jù)資源的多個(gè)應(yīng)用程序。
您不是編寫管理多用戶的應(yīng)用程序(分布式環(huán)境),而是編寫由單個(gè)事務(wù)請(qǐng)求組成的應(yīng)用程序。監(jiān)視器根據(jù)需要伸縮應(yīng)用程序。
分布式事務(wù)處理協(xié)調(diào)器 (DTC) 是用于 Microsoft Windows 2000 的TP 監(jiān)視器。
事務(wù)管理器
在分布式事務(wù)中,每個(gè)參與資源均有一個(gè)本地事務(wù)管理器 (TM) 來(lái)跟蹤此計(jì)算機(jī)上傳入的和傳出的事務(wù)。TP 監(jiān)視器將協(xié)調(diào)本地 TM 之間所有活動(dòng)的附加任務(wù)分配給一個(gè) TM。這個(gè)協(xié)調(diào)事務(wù)活動(dòng)的 TM 稱為根 TM 或協(xié)調(diào) TM。
TM 協(xié)調(diào)和管理所有的事務(wù)處理函數(shù),但不具備直接管理數(shù)據(jù)的能力。資源管理器處理與數(shù)據(jù)相關(guān)的活動(dòng)。
資源管理器
資源管理器是一項(xiàng)系統(tǒng)服務(wù),負(fù)責(zé)管理數(shù)據(jù)庫(kù)、持續(xù)消息隊(duì)列或事務(wù)性文件系統(tǒng)中的持久性或持續(xù)性數(shù)據(jù)。資源管理器存儲(chǔ)數(shù)據(jù)并執(zhí)行故障恢復(fù)。
SQL Server 和 MSMQ 提供參與分布式事務(wù)的資源管理器。Oracle、Sybase、Informix、IBM(用于 IBM DB2)和 Ingres 也提供了用于他們各自數(shù)據(jù)庫(kù)產(chǎn)品的兼容資源管理器。
資源分配器
資源分配器管理可共享的非持續(xù)狀態(tài)。例如,ODBC 資源分配器管理數(shù)據(jù)庫(kù)連接池,當(dāng)不再需要連接時(shí)收回連接。
 
5.事務(wù)模型
若要使 .NET 框架對(duì)象參與自動(dòng)事務(wù),.NET 框架類必須向 Windows 2000 組件服務(wù)注冊(cè)。但是并非所有事務(wù)都是自動(dòng)的。編寫事務(wù)程序時(shí)執(zhí)行的活動(dòng)取決于選擇的事務(wù)模型。公共語(yǔ)言運(yùn)行庫(kù)同時(shí)支持手動(dòng)和自動(dòng)事務(wù)模型。
手動(dòng)事務(wù)
Microsoft ActiveX 數(shù)據(jù)對(duì)象 (ADO)、OLE DB、開(kāi)放式數(shù)據(jù)庫(kù)連接 (ODBC) 和 Microsoft 消息隊(duì)列 (MSMQ) 的資源 API 支持手動(dòng)事務(wù)處理。
手動(dòng)事務(wù)允許顯式開(kāi)始事務(wù)、控制事務(wù)邊界內(nèi)的每個(gè)連接和資源登記、確定事務(wù)結(jié)果(提交或中止)以及結(jié)束事務(wù)。盡管此模型提供了對(duì)事務(wù)的標(biāo)準(zhǔn)控制,但它缺少一些內(nèi)置于自動(dòng)事務(wù)模型的簡(jiǎn)化操作。例如,在手動(dòng)事務(wù)中數(shù)據(jù)存儲(chǔ)區(qū)之間沒(méi)有自動(dòng)登記和協(xié)調(diào)。此外,與自動(dòng)事務(wù)不同,手動(dòng)事務(wù)中事務(wù)不在對(duì)象間流動(dòng)。
如果選擇手動(dòng)控制分布式事務(wù),則必須管理恢復(fù)、并發(fā)、安全性和完整性。也就是說(shuō),必須應(yīng)用維護(hù)與事務(wù)處理關(guān)聯(lián)的 ACID 屬性所需的所有編程方法。
手動(dòng)事務(wù)和ADO.NET
SQL 客戶端和 OLE DB .NET 提供程序在公共語(yǔ)言運(yùn)行庫(kù)中支持手動(dòng)事務(wù)。在 ADO.NET 中,這兩個(gè) .NET 提供程序都可以用來(lái)控制事務(wù)。
兩個(gè)提供程序都包括一組創(chuàng)建數(shù)據(jù)庫(kù)連接、開(kāi)始事務(wù)和提交或回滾事務(wù)的托管對(duì)象。二者之間的主要差別在于它們的連接機(jī)制。SQL 客戶端 .NET 提供程序提供一組直接調(diào)用 SQL Server 的對(duì)象。相反,OLE DB .NET 提供程序使用本機(jī) OLE DB 啟用數(shù)據(jù)訪問(wèn)。
ADO.NET 事務(wù)完全在數(shù)據(jù)庫(kù)的內(nèi)部處理,且不受 Microsoft 分布式事務(wù)處理協(xié)調(diào)器 (DTC) 或任何其他事務(wù)性機(jī)制的支持。
手動(dòng)事務(wù)和 MSMQ
用托管語(yǔ)言(如 Microsoft Visual Basic .NET)編寫的組件可以從 Microsoft 消息隊(duì)列 (MSMQ) 發(fā)送和接收消息。
MSMQ 是在應(yīng)用程序中實(shí)現(xiàn)消息隊(duì)列的技術(shù)。使用 MSMQ 可以創(chuàng)建或刪除消息隊(duì)列、發(fā)送或接收消息以及管理消息隊(duì)列。事務(wù)是企業(yè)系統(tǒng)的重要部分,而企業(yè)系統(tǒng)經(jīng)常要求 MSMQ 的異步功能。
公共語(yǔ)言運(yùn)行庫(kù)通過(guò) MessageQueueTransaction 類支持手動(dòng)事務(wù)。MSMQ 事務(wù)完全在 MSMQ 引擎的內(nèi)部處理,且不受 Microsoft 分布式事務(wù)處理協(xié)調(diào)器 (DTC) 或任何其他事務(wù)性機(jī)制的支持。
自動(dòng)事務(wù)
Microsoft 事務(wù)服務(wù)器 (MTS)、COM+ 1.0 和公共語(yǔ)言運(yùn)行庫(kù)支持相同的自動(dòng)分布式事務(wù)模型。
ASP.NET 頁(yè)、XML Web services 方法或 .NET 框架類一旦被標(biāo)記為參與事務(wù),它們將自動(dòng)在事務(wù)范圍內(nèi)執(zhí)行??梢酝ㄟ^(guò)在頁(yè)、XML Web services 方法或類中設(shè)置事務(wù)特性值來(lái)控制對(duì)象的事務(wù)性行為。特性值反過(guò)來(lái)確定實(shí)例化對(duì)象的事務(wù)性行為。因此,根據(jù)聲明特性值的不同,對(duì)象將自動(dòng)參與現(xiàn)有事務(wù)或正在進(jìn)行的事務(wù)、成為新事務(wù)的根或者根本不參與事務(wù)。聲明事務(wù)特性的語(yǔ)法在 .NET 框架類、ASP.NET 頁(yè)和 XML Web services 方法中稍有不同。
聲明性事務(wù)特性指定對(duì)象如何參與事務(wù)和如何以編程方式被配置。盡管此聲明性級(jí)別表示事務(wù)的邏輯,但它是一個(gè)已從物理事務(wù)中移除的步驟。物理事務(wù)在事務(wù)性對(duì)象訪問(wèn)數(shù)據(jù)庫(kù)或消息隊(duì)列這樣的數(shù)據(jù)資源時(shí)發(fā)生。與對(duì)象關(guān)聯(lián)的事務(wù)自動(dòng)流向合適的資源管理器。諸如 OLE DB、開(kāi)放式數(shù)據(jù)庫(kù)連接 (ODBC) 或 ActiveX 數(shù)據(jù)對(duì)象 (ADO) 的關(guān)聯(lián)驅(qū)動(dòng)程序在對(duì)象的上下文中查找事務(wù),并通過(guò)分布式事務(wù)處理協(xié)調(diào)器 (DTC) 在此事務(wù)中登記。整個(gè)物理事務(wù)自動(dòng)發(fā)生。
自動(dòng)事務(wù)和 ASP.NET
ASP.NET 在運(yùn)行 Microsoft Windows 2000 的系統(tǒng)上支持自動(dòng)事務(wù)。通過(guò)在 ASP.NET 頁(yè)中插入事務(wù)指令,可以指示該頁(yè)參與現(xiàn)有事務(wù)、開(kāi)始新事務(wù)或從不參與事務(wù)。
下表列出并描述 ASP.NET 中可用的事務(wù)指令。
指令
說(shuō)明
Disabled
指示 ASP.NET 將忽略事務(wù)上下文。這是默認(rèn)的事務(wù)狀態(tài)。
NotSupported
指示該頁(yè)不在事務(wù)范圍內(nèi)運(yùn)行。處理請(qǐng)求后,不管是否有活動(dòng)事務(wù),均在沒(méi)有事務(wù)的情況下創(chuàng)建其對(duì)象上下文。
Supported
指示該頁(yè)在現(xiàn)有事務(wù)的上下文中運(yùn)行。如果沒(méi)有事務(wù),則該頁(yè)在沒(méi)有事務(wù)的情況下運(yùn)行。
Required
該頁(yè)在現(xiàn)有事務(wù)的上下文中運(yùn)行。如果沒(méi)有事務(wù),則該頁(yè)將啟動(dòng)一個(gè)事務(wù)。
RequiresNew
指示該頁(yè)需要事務(wù)且為每個(gè)請(qǐng)求啟動(dòng)新事務(wù)。
可以通過(guò)在代碼中放置指令來(lái)指示頁(yè)上的事務(wù)支持級(jí)別。例如,插入下列指令以確保頁(yè)活動(dòng)始終在事務(wù)范圍中執(zhí)行。
<%@ Page Transaction="Required" %>

如果忽略該事務(wù)指令,則將對(duì)此頁(yè)禁用事務(wù)。

 

自動(dòng)事務(wù)和 XML Web services  [C#]

ASP.NET使用與Web窗體一致且相似的編程抽象模型為創(chuàng)建和公開(kāi)XML Web services 提供內(nèi)置支持。結(jié)果模型是可伸縮和可擴(kuò)展的,并接受 HTTP、XML、SOAP、WSDL 開(kāi)放式Internet以及其他標(biāo)準(zhǔn)。XML Web services 支持開(kāi)放式標(biāo)準(zhǔn),因此任何客戶端或支持Internet的設(shè)備都可訪問(wèn)和使用XML Web services。

XML Web services 提供了在自動(dòng)事務(wù)范圍內(nèi)運(yùn)行代碼的選項(xiàng)。事務(wù)確保與資源管理器(如 SQL Server、MSMQ 服務(wù)器、Oracle 服務(wù)器和 SNA 服務(wù)器)的所有交互維護(hù)運(yùn)行可靠的分布式應(yīng)用程序所需的ACID屬性。

使用 WebMethod 特性的 TransactionOption 屬性聲明一個(gè)自動(dòng)事務(wù)。如果將 TransactionOption 屬性設(shè)置為 TransactionOption.RequiresNew,則每次 XML Web services 客戶端調(diào)用 XML Web services 方法時(shí),都會(huì)開(kāi)始一個(gè)新事務(wù)。

下列代碼片斷顯示公開(kāi)一個(gè) XML Web services 方法(名為 DeleteAuthor)的服務(wù)。此 XML Web services 方法執(zhí)行一個(gè)自動(dòng)事務(wù)范圍內(nèi)的數(shù)據(jù)庫(kù)操作。

 

<%@ WebService Language="C#" Class="Orders" %>

<%@ assembly name="System.EnterpriseServices" %>

 

using System;

using System.Data;

using System.Data.SqlClient;

using System.Web.Services;

using System.Web.Util;

using System.EnterpriseServices;

 

public class Orders : WebService

 {

     [ WebMethod(TransactionOption=TransactionOption.RequiresNew)]

     public int DeleteAuthor(string lastName) 

     {

       String deleteCmd = "DELETE FROM authors2

          where au_lname='" + lastName + "'" ;

   

         SqlConnection sqlConn = new SqlConnection("user

          id=sa;database=pubs;server=myserver");

         SqlCommand myCommand = new SqlCommand(deleteCmd,sqlConn);

 

   // If a XML Web service method is participating in a transaction and an

   // exception occurs, ASP.NET automatically aborts the transaction.

   // Likewise, if no exception occurs, then the transaction is

   // automatically committed.

 

         myCommand.Connection.Open();

      return myCommand.ExecuteNonQuery();

     }

}

      

注意: 僅當(dāng)激活的XML Web services方法(從客戶端調(diào)用的方法)有事務(wù)元數(shù)據(jù)時(shí),事務(wù)才會(huì)開(kāi)始。如果激活的 XML Web services 方法未攜帶合適的事務(wù)元數(shù)據(jù),則后繼的 XML Web services 方法可能既不參與現(xiàn)有事務(wù)也不開(kāi)始新事務(wù)。

自動(dòng)事務(wù)和.NET 框架類  [C#]

只要準(zhǔn)備了.NET 框架類參與自動(dòng)事務(wù),此類的實(shí)例就可以參與自動(dòng)事務(wù)。類實(shí)例或?qū)ο笤L問(wèn)的每個(gè)資源都在事務(wù)中登記。例如,如果一個(gè)對(duì)象使用 ADO.NET 發(fā)送數(shù)據(jù)庫(kù)中某帳戶上的錢,此數(shù)據(jù)庫(kù)的資源管理器將確定該對(duì)象是否在事務(wù)中執(zhí)行。如果對(duì)象是在事務(wù)中執(zhí)行,則資源管理器自動(dòng)在事務(wù)中登記此數(shù)據(jù)庫(kù)。

使用下列過(guò)程準(zhǔn)備參與自動(dòng)事務(wù)的類:

  1. 將 TransactionAttribute 應(yīng)用于此類。
  2. 從 ServicedComponent 類派生此類。
  3. 用強(qiáng)名稱為程序集簽名。

若要使用特性為程序集簽名,請(qǐng)使用 Sn.exe 實(shí)用工具創(chuàng)建一個(gè)密鑰對(duì)。

sn -k TestApp.snk

添加 AssemblyKeyFileAttributeAssemblyKeyNameAttribute 程序集特性(它們指定包含密鑰對(duì)的文件的名稱),以使用強(qiáng)名稱為程序集簽名。

[assembly: AssemblyKeyFileAttribute("TestApp.snk")]
  1. 向 COM+ 目錄注冊(cè)包含此類的程序集。

如果類的客戶端調(diào)用實(shí)例是由公共語(yǔ)言運(yùn)行庫(kù)管理的,則注冊(cè)將自動(dòng)執(zhí)行。但是,如果預(yù)期非托管調(diào)用方可能創(chuàng)建和調(diào)用類的實(shí)例,請(qǐng)使用 .NET 服務(wù)安裝工具 (Regsvcs.exe) 手動(dòng)執(zhí)行注冊(cè)。

下列示例顯示如何將 TransactionAttribute 應(yīng)用到從 ServicedComponent 類派生的類。


[Transaction(TransactionOption.Required)]
public class Bar(): ServicedComponent
{
 //. . .
}

應(yīng)用事務(wù)特性時(shí),可以交替使用 Transaction、transactionTransactionAttributetransactionattribute。例如,可以使用 Transactiontransactionattribute 產(chǎn)生相同的結(jié)果。

下表列出并描述每個(gè)構(gòu)造函數(shù)變體。

特性值

說(shuō)明

Disabled

消除自動(dòng)事務(wù)對(duì)對(duì)象的控制。應(yīng)用此特性值的對(duì)象可以直接將分布式事務(wù)處理協(xié)調(diào)器 (DTC) 用于事務(wù)性支持。

[Transaction(TransactionOption.Disabled)]

NotSupported

指示對(duì)象不在事務(wù)范圍內(nèi)運(yùn)行。處理請(qǐng)求后,不管是否有活動(dòng)事務(wù),均在沒(méi)有事務(wù)的情況下創(chuàng)建其對(duì)象上下文。

[Transaction(TransactionOption.NotSupported)]

Supported

指示如果有事務(wù),則對(duì)象在現(xiàn)有事務(wù)的上下文中運(yùn)行。如果沒(méi)有事務(wù),則對(duì)象在沒(méi)有事務(wù)的情況下運(yùn)行。

[Transaction(TransactionOption.Supported)]

Required

(默認(rèn)值)

指示對(duì)象需要事務(wù)。如果有事務(wù),則對(duì)象在現(xiàn)有事務(wù)范圍中運(yùn)行。如果沒(méi)有事務(wù),則對(duì)象啟動(dòng)一個(gè)事務(wù)。

[Transaction(TransactionOption.Required)]

RequiresNew

指示對(duì)象需要事務(wù)且為每個(gè)請(qǐng)求啟動(dòng)新事務(wù)。

[Transaction(TransactionOption.RequiresNew)]

示例類

下列代碼示例說(shuō)明自動(dòng)事務(wù)的若干元素。此例中,事務(wù)性類和調(diào)用此類的客戶端都由運(yùn)行庫(kù)管理。




// -----------------------------------------------------------------
// TestApp.cs
// Generate a Strong name: 
//    sn -k TestApp.snk
// Compile the code:
//    csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs
// Run TestApp:
//    start TestApp.exe
// -----------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
using System.Reflection;
 
//Registration details.
//COM+ application name as it appears in the COM+ catalog.
[assembly: ApplicationName("TestApp")]
//Strong name for assembly.
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]
 
[Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
 //Provides SetComplete behavior in the absence of exceptions.
 [AutoComplete]
 public void Debit(int amount)
 {
     // Do some database work. Any exception thrown here aborts the 
     // transaction; otherwise, transaction commits.
 }
}
 
public class client
{
 public static int Main() 
  {
    Account accountX = new Account();
    accountX.Debit(100);
    return 0;
 }
}
自動(dòng)事務(wù)中的投票  [C#]

.NET 框架類和 ASP.NET 頁(yè)可以通過(guò)投票來(lái)提交或中止它們的當(dāng)前事務(wù)。默認(rèn)情況下,如果代碼中沒(méi)有顯式投票,則默認(rèn)為贊成提交。但默認(rèn)提交可能會(huì)延長(zhǎng)為每個(gè)事務(wù)釋放昂貴資源所用的時(shí)間,從而可能降低應(yīng)用程序的性能。

顯式投票還允許類或頁(yè)在遇到嚴(yán)重錯(cuò)誤時(shí)中止事務(wù)。此外,可以通過(guò)在事務(wù)處理的早期捕獲致命錯(cuò)誤、結(jié)束事務(wù)、釋放資源等手段來(lái)提高應(yīng)用程序的性能。

使用自動(dòng)完成

System.EnterpriseServices.AutoCompleteAttribute 使參與事務(wù)的對(duì)象投票贊成在方法正常返回時(shí)完成事務(wù)。如果方法調(diào)用引發(fā)異常,則中止事務(wù)。只能將此特性應(yīng)用于從 ServicedComponent 類派生的類。

若要使用此功能,請(qǐng)?jiān)陬惙椒ㄇ安迦氪颂匦?。如果將此特性添加到接口方法,則公共語(yǔ)言運(yùn)行庫(kù)將忽略它。下列代碼片斷顯示此特性在事務(wù)識(shí)別類上的位置。

 

[Transaction(TransactionOption.Supported)]
public class Account : ServicedComponent {
    [AutoComplete]
    public void Debit(int amount) {
        // Do some database work. Any exception thrown here aborts the transaction; 
        // otherwise, transaction commits.
    }
}

使用SetAbort 和SetComplete

可以使用公開(kāi) SetCompleteSetAbort 方法的 System.EnterpriseServices.ContextUtil 類來(lái)顯式提交或中止事務(wù)。SetComplete 指示對(duì)象投票贊成提交其工作;SetAbort 指示對(duì)象遇到了問(wèn)題且投票贊成中止正在進(jìn)行的事務(wù)。直到事務(wù)的根對(duì)象停用,才提交或中止事務(wù)。此外,任何參與事務(wù)的對(duì)象中有一個(gè)中止投票,都將導(dǎo)致整個(gè)事務(wù)失敗。

下列代碼片斷顯示正在使用的 SetAbortSetComplete 方法。

//Try to do something crucial to the transaction in progress.
if( !DoSomeWork() )
{
 //Something goes wrong.
 ContextUtil.SetAbort();
}
else
{
 //All goes well.
 ContextUtil.SetComplete();
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多