WebMethod屬性的TransactionOption屬性規(guī)定一個XML Web服務(wù)方法如何參與一個事務(wù)。雖然這個聲明級別表示一個事務(wù)邏輯,但是它是消除實際事務(wù)的一個步驟。當事物對象訪問數(shù)據(jù)源(如數(shù)據(jù)庫或消息隊列)時實際事務(wù)產(chǎn)生。關(guān)聯(lián)該對象的事務(wù)自動流向適當?shù)馁Y源管理程序。像.NET Framework Data Provider(用于SQL Server或OLE DB)這樣的.NET Framework數(shù)據(jù)提供者在對象的上下文中查找事務(wù)并通過Distributed Transaction Coordinator (DTC,分布式事務(wù)協(xié)調(diào)程序)編目事務(wù)。全部的事務(wù)自動產(chǎn)生。
XML Web服務(wù)方法只能參與一個作為新事務(wù)的根的事務(wù)。作為一個新事務(wù)的根,所有的與資源管理器(像運行Microsoft SQL Server、Microsoft Message Queuing和Microsoft Host Integration Server的服務(wù)器)的相互作用維護需要運行健壯的分布式應(yīng)用程序的ACID性質(zhì)。調(diào)用其他的XML Web服務(wù)方法的XML Web服務(wù)方法參與不同的事務(wù),因為事務(wù)不流經(jīng)XML Web服務(wù)方法。
使用來自XML Web服務(wù)方法的事務(wù)
聲明一個XML Web服務(wù)。
| [C#] <%@ WebService Language="C#" Class="Orders" %> [Visual Basic] <%@ WebService Language="VB" Class="Orders" %> |
把一個匯編指令加到System.EnterpriseServices上。
| <%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %> |
添加引用到System.Web.Services和System.EnterpriseServices域名空間。
| [C#] using System.Web.Services; using System.EnterpriseServices; [Visual Basic] Imports System.Web.Services Imports System.EnterpriseServices |
聲明一個XML Web服務(wù)方法,設(shè)置WebMethod屬性的TransactionOption屬性為TransactionOption.RequiresNew。
| [C#] [ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) [Visual Basic] < WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _ Public Function DeleteAuthor(lastName As String) As Integer |
下面的代碼示例顯示一個使用單個XML Web服務(wù)方法的XML Web服務(wù),調(diào)用DeleteDatabase。這個XML Web服務(wù)方法執(zhí)行一個事務(wù)范圍內(nèi)的數(shù)據(jù)庫操作。如果該數(shù)據(jù)庫操作拋出一個異常,該事務(wù)自動地停止;否則,該事務(wù)自動地委托。
| [C#] <%@ WebService Language="C#" Class="Orders" %> <%@ Assembly name="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %> using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; using System.EnterpriseServices; public class Orders : WebService { [ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) { String deleteCmd = "DELETE FROM authors WHERE au_lname='" + lastName + "'" ; String exceptionCausingCmdSQL = "DELETE FROM NonExistingTable WHERE au_lname='" + lastName + "'" ; SqlConnection sqlConn = new SqlConnection( "Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver"); SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL,sqlConn); SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,sqlConn); // This command should execute properly. deleteCmd.Connection.Open(); deleteCmd.ExecuteNonQuery(); // This command results in an exception, so the first command is // automatically rolled back. Since the XML Web service method is // participating in a transaction, and an exception occurs, ASP.NET // automatically aborts the transaction. The deleteCmd that // executed properly is rolled back. int cmdResult = exceptionCausingCmd.ExecuteNonQuery(); sqlConn.Close(); return cmdResult; } } [Visual Basic] <%@ WebService Language="VB" Class="Orders" %> <%@ assembly name="System.EnterpriseServices" %> Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Web.Services Imports System.Web.Util Imports System.EnterpriseServices Public Class Orders <WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _ Public Function DeleteAuthor (lastName as String) as Integer Dim deleteCmdSQL As String = "DELETE FROM authors WHERE au_lname='" + _ lastName + "'" Dim exceptionCausingCmdSQL As String = "DELETE FROM " + _ "NonExistingTable WHERE au_lname='" + lastName + "'" Dim sqlConn As SqlConnection = New SqlConnection( _ "Persist Security Info=False;Integrated Security=SSPI;database=pubs;server=myserver") Dim deleteCmd As SqlCommand = New SqlCommand(deleteCmdSQL,sqlConn) Dim exceptionCausingCmd As SqlCommand = New _ SqlCommand(exceptionCausingCmdSQL,sqlConn) ' This command should execute properly. deleteCmd.Connection.Open() deleteCmd.ExecuteNonQuery() ' This command results in an exception, so the first command is ' automatically rolled back. Since the XML Web service method is ' participating in a transaction, and an exception occurs, ASP.NET ' automatically aborts the transaction. The deleteCmd that ' executed properly is rolled back. Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery() sqlConn.Close() Return cmdResult End Function End Class |
