ASP.NET支持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服务方法。
ASP.NET使用来自XML Web服务方法的事务
声明一个XML Web服务。
- <%@WebServiceLanguage="C#"Class="Orders"%>
- <%@Assemblyname="System.EnterpriseServices,Version=1.0.3300.0,
Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"%>- usingSystem;
- usingSystem.Data;
- usingSystem.Data.SqlClient;
- usingSystem.Web.Services;
- usingSystem.EnterpriseServices;
- publicclassOrders:WebService
- {
- [WebMethod(TransactionOptionTransactionOption=TransactionOption.RequiresNew)]
- publicintDeleteAuthor(stringlastName)
- {
- StringdeleteCmd="DELETEFROMauthorsWHEREau_lname='"+
- lastName+"'";
- StringexceptionCausingCmdSQL="DELETEFROMNonExistingTableWHERE
- au_lname='"+lastName+"'";
- SqlConnectionsqlConn=newSqlConnection(
- "PersistSecurityInfo=False;IntegratedSecurity=SSPI;database=pubs;server=myserver");
- SqlCommanddeleteCmd=newSqlCommand(deleteCmdSQL,sqlConn);
- SqlCommandexceptionCausingCmd=new
- SqlCommand(exceptionCausingCmdSQL,sqlConn);
- //Thiscommandshouldexecuteproperly.
- deleteCmd.Connection.Open();
- deleteCmd.ExecuteNonQuery();
- //Thiscommandresultsinanexception,sothefirstcommandis
- //automaticallyrolledback.SincetheXMLWebservicemethodis
- //participatinginatransaction,andanexceptionoccurs,ASP.NET
- //automaticallyabortsthetransaction.ThedeleteCmdthat
- //executedproperlyisrolledback.
- intcmdResult=exceptionCausingCmd.ExecuteNonQuery();
- sqlConn.Close();
- returncmdResult;
- }
- }
- [VisualBasic]
- <%@WebServiceLanguage="VB"Class="Orders"%>
- <%@assemblyname="System.EnterpriseServices"%>
- ImportsSystem
- ImportsSystem.Data
- ImportsSystem.Data.SqlClient
- ImportsSystem.Web.Services
- ImportsSystem.Web.Util
- ImportsSystem.EnterpriseServices
- PublicClassOrders
- <WebMethod(TransactionOptionTransactionOption:=TransactionOption.RequiresNew)>_
- PublicFunctionDeleteAuthor(lastNameasString)asInteger
- DimdeleteCmdSQLAsString="DELETEFROMauthorsWHEREau_lname='"+_
- lastName+"'"
- DimexceptionCausingCmdSQLAsString="DELETEFROM"+_
- "NonExistingTableWHEREau_lname='"+lastName+"'"
- DimsqlConnAsSqlConnection=NewSqlConnection(_
- "PersistSecurityInfo=False;IntegratedSecurity=SSPI;database=pubs;server=myserver")
- DimdeleteCmdAsSqlCommand=NewSqlCommand(deleteCmdSQL,sqlConn)
- DimexceptionCausingCmdAsSqlCommand=New_
- SqlCommand(exceptionCausingCmdSQL,sqlConn)
- 'Thiscommandshouldexecuteproperly.
- deleteCmd.Connection.Open()
- deleteCmd.ExecuteNonQuery()
- 'Thiscommandresultsinanexception,sothefirstcommandis
- 'automaticallyrolledback.SincetheXMLWebservicemethodis
- 'participatinginatransaction,andanexceptionoccurs,ASP.NET
- 'automaticallyabortsthetransaction.ThedeleteCmdthat
- 'executedproperlyisrolledback.
- DimcmdResultAsInteger=exceptionCausingCmd.ExecuteNonQuery()
- sqlConn.Close()
- ReturncmdResult
- EndFunction
- EndClass
【编辑推荐】