XML 웹 서비스에 대한 트랜잭션 지원은 MTS(Microsoft Transaction Server) 및 COM+ 서비스에 있는 것과 동일한 분산 트랜잭션 모델을 기반으로 하는 공용 언어 런타임의 지원을 활용합니다. 이 모델은 트랜잭션에 대한 위임 및 콜백을 처리하기 위한 특정 코드를 작성하는 대신 객체가 트랜잭션에 참여하는지 여부를 명시적으로 결정하는 데 기반을 두고 있습니다. ASP.NET을 사용하여 만든 XML Web services의 경우 XML Web services 메서드에 적용되는 WebMethod 특성의 TransactionOption 특성을 설정하여 XML Web services의 트랜잭션 동작을 선언할 수 있습니다. XML Web services 메서드가 실행될 때 예외가 발생하면 트랜잭션이 자동으로 종료되고, 예외가 발생하지 않으면 트랜잭션이 자동으로 위임됩니다.
WebMethod 특성의 TransactionOption 특성은 XML Web services 메서드가 트랜잭션에 참여하는 방식을 지정합니다. 이 선언 수준은 트랜잭션 논리를 나타내지만 실제 트랜잭션과는 한 단계 떨어져 있습니다. 실제 트랜잭션은 트랜잭션 객체가 데이터 소스(예: 데이터베이스 또는 메시지 큐)에 액세스할 때 발생합니다. 이 개체와 연결된 트랜잭션은 자동으로 적절한 리소스 관리자로 전달됩니다. .NET Framework 데이터 공급자(SQL Server 또는 OLE DB용)와 같은 .NET Framework 데이터 공급자는 개체 컨텍스트에서 트랜잭션을 찾고 DTC(Distributed Transaction Coordinator)를 통해 트랜잭션을 카탈로그화합니다. 모든 거래는 자동으로 생성됩니다.
XML Web services 메서드는 새 트랜잭션의 루트인 트랜잭션에만 참여할 수 있습니다. 새로운 트랜잭션의 루트로서 리소스 관리자(예: Microsoft SQL Server, Microsoft Message Queuing 및 Microsoft Host Integration Server를 실행하는 서버)와의 모든 상호 작용은 강력한 분산 응용 프로그램을 실행하는 데 필요한 ACID 속성을 유지합니다. 트랜잭션이 XML Web services 메서드를 통해 흐르지 않기 때문에 다른 XML Web services 메서드를 호출하는 XML Web services 메서드는 다양한 트랜잭션에 참여합니다.
XML Web services 메서드의 트랜잭션을 사용하여
XML Web services를 선언합니다.
[기음#]
<%@ WebService Language="C#" 클래스="주문" %>
[비주얼베이직]
<%@ 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 도메인 이름 공간에 대한 참조를 추가합니다.
[기음#]
System.Web.Services 사용;
System.EnterpriseServices 사용;
[비주얼베이직]
System.Web.Services를 가져옵니다.
Imports System.EnterpriseServices는
XML Web services 메서드를 선언하고 WebMethod 특성의 TransactionOption 속성을 TransactionOption.RequiresNew로 설정합니다.
[기음#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
공개 int DeleteAuthor(문자열 성)
[비주얼베이직]
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
공용 함수 DeleteAuthor(lastName As String) As Integer
다음 코드 예제에서는 단일 XML Web services 메서드를 사용하여 DeleteDatabase를 호출하는 XML Web Service를 보여 줍니다. 이 XML Web services 메서드는 트랜잭션 범위 내에서 데이터베이스 작업을 수행합니다. 데이터베이스 작업에서 예외가 발생하면 트랜잭션이 자동으로 중지됩니다. 그렇지 않으면 트랜잭션이 자동으로 커밋됩니다.
[기음#]
<%@ WebService Language="C#" 클래스="주문" %>
<%@ 어셈블리 이름="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
시스템 사용;
System.Data 사용;
System.Data.SqlClient 사용;
System.Web.Services 사용;
System.EnterpriseServices
공용 클래스 Orders 사용: WebService
{
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
공개 int DeleteAuthor(문자열 성)
{
String deleteCmd = "au_lname='인 곳에서 작성자로부터 삭제" +
성 + "'" ;
문자열 예외CausingCmdSQL = "WHERE NonExistingTable에서 삭제
au_lname='" + lastName + "'" ;
SqlConnection sqlConn = new SqlConnection(
"보안 정보 유지=False;통합 보안=SSPI;데이터베이스=pubs;서버=myserver");
SqlCommand deleteCmd = new SqlCommand(deleteCmdSQL,sqlConn);
SqlCommand 예외CausingCmd = 신규
SqlCommand(ExceptionCausingCmdSQL,sqlConn);
// 이 명령은 제대로 실행되어야 합니다.
deleteCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// 이 명령은 예외를 발생시키므로 첫 번째 명령은 다음과 같습니다.
// 자동으로 롤백되기 때문에 XML Web services 메서드는 다음과 같습니다.
// 트랜잭션에 참여하고 예외가 발생합니다. ASP.NET
// 자동으로 트랜잭션을 중단합니다.
// 제대로 실행되면 롤백됩니다.
int cmdResult = 예외CausingCmd.ExecuteNonQuery()
sqlConn.Close()
;
}
}
[비주얼베이직]
<%@ WebService Language="VB" 클래스="주문" %>
<%@ 어셈블리 이름="System.EnterpriseServices" %>
시스템 가져오기
ImportsSystem.Data
System.Data.SqlClient를 가져옵니다.
System.Web.Services를 가져옵니다.
System.Web.Util을 가져옵니다.
System.EnterpriseServices
공용 클래스 주문
가져오기<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
공용 함수 DeleteAuthor(lastName as String) as Integer
Dim deleteCmdSQL As String = "DELETE FROM Author WHERE au_lname='" + _
성 + "'"
Dim 예외CausingCmdSQL As String = "DELETE FROM " + _
"NonExistingTable WHERE au_lname='" + lastName + "'"
Dim sqlConn As SqlConnection = New SqlConnection( _
"보안 정보 유지=False;통합 보안=SSPI;데이터베이스=pubs;서버=myserver")
Dim deleteCmd As SqlCommand = New SqlCommand(deleteCmdSQL,sqlConn)
희미한 예외CausingCmd As SqlCommand = New _
SqlCommand(ExceptionCausingCmdSQL,sqlConn)
' 이 명령은 제대로 실행되어야 합니다.
삭제Cmd.Connection.Open()
deleteCmd.ExecuteNonQuery()
' 이 명령은 예외를 발생시키므로 첫 번째 명령은 다음과 같습니다.
' XML Web services 메서드는 자동으로 롤백됩니다.
' 트랜잭션에 참여하고 예외가 발생합니다. ASP.NET
'는 트랜잭션을 자동으로 중단합니다.
Dim cmdResult As Integer = 예외CausingCmd.ExecuteNonQuery()
가 롤백됩니다.
sqlConn.Close()
cmdResult 반환
기능 종료
수업 종료