ASP.NET的XML Web服務(wù)方法
ASP.NET支持XML Web服務(wù)方法的事務(wù)利用公共語言運行期中的支持,其是基于Microsoft Transaction Server ( MTS)和COM+ Services中相同的分布式事務(wù)模型。該模型基于明確的判斷一個對象是否參與一個事務(wù),而不是編寫特定的代碼用來處理委托和回調(diào)一個事務(wù)。對于一個使用ASP.NET創(chuàng)建的XML Web服務(wù),你可以通過設(shè)置其應(yīng)用到一個XML Web服務(wù)方法上的WebMethod屬性的TransactionOption屬性來聲明一個XML Web服務(wù)的事務(wù)行為。如果該XML Web服務(wù)方法執(zhí)行的時候拋出一個異常,那么該事務(wù)自動地結(jié)束;相反,如果沒有發(fā)生異常,該事務(wù)自動委托。
WebMethod屬性的TransactionOption屬性規(guī)定一個XML Web服務(wù)方法如何參與一個事務(wù)。雖然這個聲明級別表示一個事務(wù)邏輯,但是它是消除實際事務(wù)的一個步驟。當(dāng)事物對象訪問數(shù)據(jù)源(如數(shù)據(jù)庫或消息隊列)時實際事務(wù)產(chǎn)生。關(guān)聯(lián)該對象的事務(wù)自動流向適當(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ù)自動產(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ù)方法。
ASP.NET使用來自XML Web服務(wù)方法的事務(wù)
聲明一個XML Web服務(wù)。
- <%@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
【編輯推薦】