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 データ プロバイダー (SQL Server または OLE DB 用) などの .NET Framework データ プロバイダーは、オブジェクトのコンテキストでトランザクションを検索し、分散トランザクション コーディネーター (DTC、分散トランザクション コーディネーター) を通じてそれらをカタログ化します。すべてのトランザクションは自動的に生成されます。
XML Web サービス メソッドは、新しいトランザクションのルートであるトランザクションにのみ参加できます。新しいトランザクションのルートとして、リソース マネージャー (Microsoft SQL Server、Microsoft メッセージ キュー、Microsoft Host Integration Server を実行しているサーバーなど) とのすべての対話は、堅牢な分散アプリケーションを実行するために必要な ACID プロパティを維持します。トランザクションは XML Web サービス メソッドを経由しないため、他の XML Web サービス メソッドを呼び出す XML Web サービス メソッドは、別のトランザクションに参加します。
XML Webサービス メソッドのトランザクションを使用して、XML Web
サービスを宣言します。
[C#]
<%@ Webサービス言語="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 ドメイン名空間への参照を追加します。
[C#]
System.Web.Services を使用します。
System.EnterpriseServices を使用します。
【ビジュアルベーシック】
System.Web.Services をインポートします
System.EnterpriseServices をインポートし、
XML Web サービス メソッドを宣言し、WebMethod 属性の TransactionOption プロパティを TransactionOption.RequiresNew に設定します。
[C#]
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string lastName)
【ビジュアルベーシック】
<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Public Function DeleteAuthor(lastName As String) As Integer
次のコード例は、単一の XML Web サービス メソッドを使用して、DeleteDatabase を呼び出す XML Web サービスを示しています。この XML Web サービス メソッドは、トランザクションのスコープ内でデータベース操作を実行します。データベース操作で例外がスローされた場合、トランザクションは自動的に停止されます。それ以外の場合、トランザクションは自動的にコミットされます。
[C#]
<%@ Webサービス言語="C#" クラス="注文" %>
<%@ アセンブリ名="System.EnterpriseServices,Version=1.0.3300.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" %>
システムを使用する;
System.Data を使用します。
System.Data.SqlClient を使用します。
System.Web.Services を使用します。
System.EnterpriseServices
のパブリック クラス Orders を使用します。
{
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string lastName)
{
String deleteCmd = "著者から削除 WHERE au_lname='" +
姓 + "'" ;
文字列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 例外の原因Cmd = new
SqlCommand(ExceptionCausingCmdSQL,sqlConn);
// このコマンドは正しく実行されるはずです。
deleteCmd.Connection.Open();
deleteCmd.ExecuteNonQuery();
// このコマンドは例外を引き起こすため、最初のコマンドは
// XML Web サービス メソッドは自動的にロールバックされます。
// トランザクションに参加しているため、例外が発生します。ASP.NET
// トランザクションを自動的に中止する deleteCmd。
// 正常に実行された場合はロールバックされます。
int cmdResult =ExceptionCausingCmd.ExecuteNonQuery()
;
return cmdResult;
}
}
【ビジュアルベーシック】
<%@ Webサービス言語="VB" クラス="注文" %>
<%@アセンブリ名="System.EnterpriseServices" %>
システムをインポートします
インポートSystem.Data
System.Data.SqlClient をインポートします
System.Web.Services をインポートします
System.Web.Util をインポートします
System.EnterpriseServices
パブリック クラスの注文
をインポートします<WebMethod(TransactionOption:=TransactionOption.RequiresNew)> _
Public Function DeleteAuthor (lastName as String) as Integer
Dim deleteCmdSQL As String = "DELETE FROM authors WHERE au_lname='" + _
姓 + ""
DimExceptionCausingCmdSQL 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)
DimExceptionCausingCmd As SqlCommand = New _
SqlCommand(ExceptionCausingCmdSQL,sqlConn)
' このコマンドは適切に実行されるはずです。
deleteCmd.Connection.Open()
deleteCmd.ExecuteNonQuery()
' このコマンドは例外を引き起こすため、最初のコマンドは
' XML Web サービス メソッドは自動的にロールバックされます。
' トランザクションに参加しているときに例外が発生しました、ASP.NET
' トランザクションを自動的に中止します。
' 正しく実行された場合はロールバックされます。
Dim cmdResult As Integer =ExceptionCausingCmd.ExecuteNonQuery()
sqlConn.Close()
cmdResult を返す
終了機能
終了クラス