ASP.NET创建Web服务之使用事务

日期: 2008-04-07 来源:TechTarget中国

  支持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和System.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 WHEREau_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 = newSqlCommand(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


  <WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _


  Public Class Orders _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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐