連載
» 2006年08月19日 00時00分 公開

分散トランザクション管理とSQL CLR活用のヒントSQL Server 2005を使いこなそう(7)(2/3 ページ)

[石橋潤一,株式会社システムインテグレータ]

TransactionScopeによる分散トランザクション管理

 TransactionScopeについてあれこれ説明するよりも、まずはコードを見てみましょう。リスト2の冒頭でTransactionScopeオブジェクトを作成していますが、そのほかにトランザクション・オブジェクトを作成していない点に注目してください。

using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Transactions;
public partial class StoredProcedures
{
  [Microsoft.SqlServer.Server.SqlProcedure]
  public static void SampleStored()
  {
    using (TransactionScope ts = new TransactionScope())
    {
      try
      {
        using (SqlConnection conn = new SqlConnection(
            "server=myserver; database=AdventureWorks; " +
            "user id=myuser; password=mypassword"))
        {
          conn.Open();
          SqlCommand cmd = new SqlCommand(
              "UPDATE Person.Contact SET FirstName='atmark'," +
              "LastName='taro' WHERE ContactID=1", conn);
          cmd.ExecuteNonQuery();
          using (SqlConnection conn2 = new SqlConnection(
              "context connection=true"))
          {
            conn2.Open();
            SqlCommand cmd2 = new SqlCommand(
                "UPDATE Person.Contact SET FirstName='atmark'," + 
                "LastName='jiro' WHERE ContactID=2", conn2);
            cmd2.ExecuteNonQuery();
          }
        }
        //トランザクションがコミットされる
        ts.Complete();
      }
      catch (SqlException ex)
      {
        //Completeメソッドが呼び出されない場合、
        //トランザクションは暗黙的にロールバックされる
        SqlContext.Pipe.Send("SQL失敗:" + ex.Message);
      }
      //Completeメソッドが呼び出されない場合、
      //トランザクションは暗黙的にロールバックされる
    }
  }
}
リスト2 TransactionScopeによるトランザクション管理

System.Transactionsを利用するには、System.Transactions.dllへの参照が必要です。Visual Studioのメニュー「プロジェクト」−「参照の追加」より「System.Transactions」を加えてください。

また、分散トランザクションを利用するにはMSDTC(Microsoft Distributed Transaction Coordinator)サービスがサーバ側で利用可能な状態である必要があります。「管理ツール」-「サービス」より「Distributed Transaction Coordinator」を開始してください。


 上記サンプルでは、TransactionScopeブロック内で、2つの異なるインスタンスに対する更新を行っています。このとき、それぞれの接続は分散トランザクションとして管理され、TransactionScope.Completeメソッドによってコミットが実行されます。

 usingステートメントが終了するとTransactionScope.Disposeメソッドが自動的に呼び出されます。このとき、Completeメソッドが呼び出されずに、オブジェクトの破棄(Dispose)が行われた場合はトランザクションがロールバックされます。

 このように、System.Transactionsの利用により、分散トランザクションを簡単に利用できます。ただし、一点気を付けたいところとして、TransactionScopeを利用した場合、常に分散トランザクションとしてトランザクションが管理されます。このため、ローカルサーバにしか接続しない場合でも、分散トランザクションに昇格するためのオーバーヘッドが発生してしまいます。コンテキスト接続のみの場合は、TransactionScopeの利用は避けるべきです。

 以上のように、SQL CLRはSystem.Transactionsによって分散トランザクションを容易に利用することが可能となりました。単一のインスタンスへの処理を行うTransact-SQLに対し、複数のインスタンスへ処理が可能となったSQL CLRでは、非常に重要な機能といえます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。