.net事務處理

   事 務 處 理

 
1.事務處理基本原理
事務是一組作爲一個單元成功或失敗的相關任務。在事務處理術語中,事務要麼提交,要麼中止。若要提交事務,所有參與者都必須保證對數據的任何更改是永久的。不論系統崩潰或是發生其他無法預料的事件,更改都必須是持久的。
只要有一個參與者無法做出此保證,整個事務就會失敗。事務範圍內的所有數據更改將回滾到特定設置點。
事務將多個任務綁定在一起。例如,假設某個 ASP.NET 頁執行兩個任務。它首先在數據庫中創建一個新表。接着調用專用對象收集和格式化數據,並在新表中插入數據。這兩個任務是相關甚至相互依賴的,因此除非可用數據填充表,否則應避免創建新表。在一個事務範圍內執行兩個任務會加強兩者之間的關係。如果第二個任務失敗,則第一個任務回滾到創建新表前的點。
如此例所示,可將事務限制到一個數據資源,如數據庫或消息隊列。這些數據資源通常提供本地事務功能。這些事務由數據資源控制,管理起來輕鬆高效。
事務還可以跨越多個數據資源。分佈式事務使您得以將出現在不同系統上的若干不同操作合併爲單個的成功或失敗操作。
 
2.ACID 屬性
ACID 一詞表達了事務在使命關鍵的應用程序中所起的作用。ACID 是由事務處理先驅者創立的,代表了不可分性、一致性、隔離性和持續性。
這些屬性確保可預知行爲的安全性,加強了事務作爲“全或無”命題的作用,而此命題旨在有很多變量時減少管理負荷。

不可分性

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

如果忽略該事務指令,則將對此頁禁用事務。

 

自動事務和 XML Web services  [C#]

ASP.NET使用與Web窗體一致且相似的編程抽象模型爲創建和公開XML Web services 提供內置支持。結果模型是可伸縮和可擴展的,並接受 HTTP、XML、SOAP、WSDL 開放式Internet以及其他標準。XML Web services 支持開放式標準,因此任何客戶端或支持Internet的設備都可訪問和使用XML Web services。

XML Web services 提供了在自動事務範圍內運行代碼的選項。事務確保與資源管理器(如 SQL Server、MSMQ 服務器、Oracle 服務器和 SNA 服務器)的所有交互維護運行可靠的分佈式應用程序所需的ACID屬性。

使用 WebMethod 特性的 TransactionOption 屬性聲明一個自動事務。如果將 TransactionOption 屬性設置爲 TransactionOption.RequiresNew,則每次 XML Web services 客戶端調用 XML Web services 方法時,都會開始一個新事務。

下列代碼片斷顯示公開一個 XML Web services 方法(名爲 DeleteAuthor)的服務。此 XML Web services 方法執行一個自動事務範圍內的數據庫操作。

 

<%@ 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();

     }

}

      

注意: 僅當激活的XML Web services方法(從客戶端調用的方法)有事務元數據時,事務纔會開始。如果激活的 XML Web services 方法未攜帶合適的事務元數據,則後繼的 XML Web services 方法可能既不參與現有事務也不開始新事務。

自動事務和.NET 框架類  [C#]

只要準備了.NET 框架類參與自動事務,此類的實例就可以參與自動事務。類實例或對象訪問的每個資源都在事務中登記。例如,如果一個對象使用 ADO.NET 發送數據庫中某帳戶上的錢,此數據庫的資源管理器將確定該對象是否在事務中執行。如果對象是在事務中執行,則資源管理器自動在事務中登記此數據庫。

使用下列過程準備參與自動事務的類:

  1. TransactionAttribute 應用於此類。

  2. ServicedComponent 類派生此類。

  3. 用強名稱爲程序集簽名。

若要使用特性爲程序集簽名,請使用 Sn.exe 實用工具創建一個密鑰對。

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

  1. COM+ 目錄註冊包含此類的程序集。

如果類的客戶端調用實例是由公共語言運行庫管理的,則註冊將自動執行。但是,如果預期非託管調用方可能創建和調用類的實例,請使用 .NET 服務安裝工具 (Regsvcs.exe) 手動執行註冊。

下列示例顯示如何將 TransactionAttribute 應用到從 ServicedComponent 類派生的類。

[C#]

應用事務特性時,可以交替使用 TransactiontransactionTransactionAttributetransactionattribute。例如,可以使用 Transactiontransactionattribute 產生相同的結果。

下表列出並描述每個構造函數變體。

特性值

說明

Disabled

消除自動事務對對象的控制。應用此特性值的對象可以直接將分佈式事務處理協調器 (DTC) 用於事務性支持。

NotSupported

指示對象不在事務範圍內運行。處理請求後,不管是否有活動事務,均在沒有事務的情況下創建其對象上下文。

Supported

指示如果有事務,則對象在現有事務的上下文中運行。如果沒有事務,則對象在沒有事務的情況下運行。

Required

(默認值)

指示對象需要事務。如果有事務,則對象在現有事務範圍中運行。如果沒有事務,則對象啓動一個事務。

RequiresNew

指示對象需要事務且爲每個請求啓動新事務。

示例類

下列代碼示例說明自動事務的若干元素。此例中,事務性類和調用此類的客戶端都由運行庫管理。

自動事務中的投票  [C#]

.NET 框架類和 ASP.NET 頁可以通過投票來提交或中止它們的當前事務。默認情況下,如果代碼中沒有顯式投票,則默認爲贊成提交。但默認提交可能會延長爲每個事務釋放昂貴資源所用的時間,從而可能降低應用程序的性能。

顯式投票還允許類或頁在遇到嚴重錯誤時中止事務。此外,可以通過在事務處理的早期捕獲致命錯誤、結束事務、釋放資源等手段來提高應用程序的性能。

使用自動完成

System.EnterpriseServices.AutoCompleteAttribute 使參與事務的對象投票贊成在方法正常返回時完成事務。如果方法調用引發異常,則中止事務。只能將此特性應用於從 ServicedComponent 類派生的類。

若要使用此功能,請在類方法前插入此特性。如果將此特性添加到接口方法,則公共語言運行庫將忽略它。下列代碼片斷顯示此特性在事務識別類上的位置。

[C#]

使用SetAbort 和SetComplete

可以使用公開 SetCompleteSetAbort 方法的 System.EnterpriseServices.ContextUtil 類來顯式提交或中止事務。SetComplete 指示對象投票贊成提交其工作;SetAbort 指示對象遇到了問題且投票贊成中止正在進行的事務。直到事務的根對象停用,才提交或中止事務。此外,任何參與事務的對象中有一箇中止投票,都將導致整個事務失敗。

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

[C#]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章