支援XML Web服務的交易利用公共語言運行期中的支持,其是基於Microsoft Transaction Server ( MTS)和COM+ Services中相同的分散式交易模型。這個模型是基於明確的判斷一個物件是否參與一個事務,而不是編寫特定的程式碼用來處理委託和回呼一個事務。對於一個使用ASP.NET建立的XML Web服務,你可以透過設定其應用到一個XML Web服務方法上的WebMethod屬性的TransactionOption屬性來宣告一個XML Web服務的事務行為。如果該XML Web服務方法執行的時候拋出一個異常,那麼該事務自動地結束;相反,如果沒有發生異常,該事務自動委託。
WebMethod屬性的TransactionOption屬性規定一個XML Web服務方法如何參與一個事務。雖然這個聲明層級表示一個事務邏輯,但是它是消除實際事務的一個步驟。當事物物件存取資料來源(如資料庫或訊息佇列)時實際事務產生。關聯該物件的事務會自動流向適當的資源管理程序。像.NET Framework Data Provider(用於SQL Server或OLE DB)這樣的.NET Framework資料提供者在物件的上下文中尋找交易並透過Distributed Transaction Coordinator (DTC,分散式交易協調程式)編目交易。全部的事務自動產生。
XML Web服務方法只能參與一個作為新事務的根的事務。作為一個新交易的根,所有的與資源管理器(像運行Microsoft SQL Server、Microsoft Message Queuing和Microsoft Host Integration Server的伺服器)的相互作用維護需要運行健全的分散式應用程式的ACID性質。呼叫其他的XML Web服務方法的XML Web服務方法參與不同的事務,因為事務不流經XML Web服務方法。
使用來自XML Web服務方法的交易
宣告一個XML Web服務。
[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和SystemService.EnterpriseServices域名空間。
[C#]
using System.Web.Services;
using System.EnterpriseServices;
[Visual Basic]
Imports System.Web.Services
Imports System.EnterpriseServices
宣告一個XML Web服務方法,設定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服務方法的XML Web服務,呼叫DeleteDatabase。這個XML Web服務方法執行一個交易範圍內的資料庫操作。如果該資料庫操作拋出一個異常,則該事務自動地停止;否則,該事務自動地委託。
[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