ASP.NET創(chuàng)建Web服務(wù)之使用事務(wù)

字號:

支持XML Web服務(wù)的事務(wù)利用公共語言運(yùn)行期中的支持,其是基于Microsoft Transaction Server ( MTS)和COM+ Services中相同的分布式事務(wù)模型。該模型基于明確的判斷一個(gè)對象是否參與一個(gè)事務(wù),而不是編寫特定的代碼用來處理委托和回調(diào)一個(gè)事務(wù)。對于一個(gè)使用ASP.net創(chuàng)建的XML Web服務(wù),你可以通過設(shè)置其應(yīng)用到一個(gè)XML Web服務(wù)方法上的WebMethod屬性的TransactionOption屬性來聲明一個(gè)XML Web服務(wù)的事務(wù)行為。如果該XML Web服務(wù)方法執(zhí)行的時(shí)候拋出一個(gè)異常,那么該事務(wù)自動(dòng)地結(jié)束;相反,如果沒有發(fā)生異常,該事務(wù)自動(dòng)委托。
    WebMethod屬性的TransactionOption屬性規(guī)定一個(gè)XML Web服務(wù)方法如何參與一個(gè)事務(wù)。雖然這個(gè)聲明級別表示一個(gè)事務(wù)邏輯,但是它是消除實(shí)際事務(wù)的一個(gè)步驟。當(dāng)事物對象訪問數(shù)據(jù)源(如數(shù)據(jù)庫或消息隊(duì)列)時(shí)實(shí)際事務(wù)產(chǎn)生。關(guān)聯(lián)該對象的事務(wù)自動(dòng)流向適當(dāng)?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ù)自動(dòng)產(chǎn)生。
    XML Web服務(wù)方法只能參與一個(gè)作為新事務(wù)的根的事務(wù)。作為一個(gè)新事務(wù)的根,所有的與資源管理器(像運(yùn)行Microsoft SQL Server、Microsoft Message Queuing和Microsoft Host Integration Server的服務(wù)器)的相互作用維護(hù)需要運(yùn)行健壯的分布式應(yīng)用程序的ACID性質(zhì)。調(diào)用其他的XML Web服務(wù)方法的XML Web服務(wù)方法參與不同的事務(wù),因?yàn)槭聞?wù)不流經(jīng)XML Web服務(wù)方法。
    使用來自XML Web服務(wù)方法的事務(wù)
    聲明一個(gè)XML Web服務(wù)。
    [C#]
    <%@ WebService Language="C#" Class="Orders" %>
    [Visual Basic]
    <%@ WebService Language="VB" Class="Orders" %>
    把一個(gè)匯編指令加到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
    聲明一個(gè)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
    下面的代碼示例顯示一個(gè)使用單個(gè)XML Web服務(wù)方法的XML Web服務(wù),調(diào)用DeleteDatabase。這個(gè)XML Web服務(wù)方法執(zhí)行一個(gè)事務(wù)范圍內(nèi)的數(shù)據(jù)庫操作。如果該數(shù)據(jù)庫操作拋出一個(gè)異常,該事務(wù)自動(dòng)地停止;否則,該事務(wù)自動(dòng)地委托。
    [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