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

5年ぶりのメジャーバージョンアップとなったSQL Server 2005。本連載では、SQL Server 2005への移行を検討しているデータベース管理者に向け、新規に実装されたさまざまな機能の詳細を紹介していく。(編集局)

» 2006年08月19日 00時00分 公開
[石橋潤一株式会社システムインテグレータ]

主な内容

--Page 1--

SQL CLRでのトランザクション管理

--Page 2--

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

--Page 3--

SQL CLRを実際のプロジェクトでどのように生かすか

まとめ


 これまで第4〜6回の3回にわたってお送りしてきたSQL CLRの解説も今回で最後となります。ストアドプロシージャやユーザー定義関数など、一通りの利用法を取り上げましたので、今回はトランザクションの管理と、実際のプロジェクトでどのようにSQL CLRを利用すべきかを考察してみたいと思います。

SQL CLRでのトランザクション管理

 データベースを扱うプログラムでは、トランザクションの管理が必須となります。データベース内に配置されたオブジェクトとしてデータ処理を担うSQL CLRでも、トランザクションの管理を欠かすことはできません。

 SQL CLRは.NET Framework 2.0で新たに提供された「System.Transactions」名前空間と密接に統合されており、外部データベースの処理を行う場合に有用な分散トランザクションをサポートしています。分散トランザクションに触れる前に、まずは外部接続を行わない、ローカルトランザクションのみを管理する場合のコードを見てみましょう。

通常のトランザクション

 ローカルトランザクションの管理、といっても複雑な処理を行うわけではありません。見慣れた「BEGIN TRANSACTION ……」のようなSQL文の発行か、接続オブジェクト(SqlConnectionクラス)の「BeginTransaction」メソッドによって、ローカルサーバに対するトランザクションの管理を行います。SQL CLRでは、リスト1のような形で利用できます。

//コンテキスト接続
using (SqlConnection conn =
    new SqlConnection("context connection=true"))
{
  conn.Open();
  //トランザクション開始
  SqlTransaction Sqltran = conn.BeginTransaction();
  try
  {
    SqlCommand cmd = new SqlCommand(
        "UPDATE Person.Contact SET FirstName=@p1,LastName=@p2" +
        " WHERE ContactID=1", conn);
    SqlParameter p1 = new SqlParameter("@p1", null);
    SqlParameter p2 = new SqlParameter("@p2", "atmark it");
    cmd.Parameters.Add(p1);
    cmd.Parameters.Add(p2);
    //SqlTransactionの設定 
    cmd.Transaction = Sqltran;
    //UPDATE文の実行
    cmd.ExecuteNonQuery();
    //トランザクションを終了
    Sqltran.Commit();
  }
  catch(SqlException ex)
  {
    //トランザクションのロールバック
    Sqltran.Rollback();
    SqlContext.Pipe.Send("SQL失敗:" + ex.Message);
  }
}
リスト1 ローカルサーバに対するトランザクションの管理

 上記のサンプルでは、必須項目へのnull値設定によりSQLエラーが発生し、トランザクションがロールバックされます。ADO.NETによるトランザクション管理と実装方法に違いはありません。トランザクションは接続(SqlConnection)ごとにひも付いており、複数のデータベースへの処理を管理することはできません。

 SQL CLRはローカルサーバと外部サーバへの処理を一括で行えるところが利点であり、また、SQL CLRで書かれたオブジェクト自体が複数のオブジェクトから呼ばれるため、これまでのトランザクション管理方法ではこれらの機能には力不足です。そこで登場したのがSystem.Transactionsによる分散トランザクションです。

System.Transactionsによる分散トランザクション

 System.Transactionsは.NET Framework 2.0で新たに実装された名前空間です。ローカル型/分散型のトランザクションをサポートしており、従来のトランザクション管理に比べて、シンプルで効率の良いトランザクションのプログラミングが可能となります。

 System.Transactions名前空間は、非常に多様なクラスやインターフェイスをサポートしていますが、ここではSQL CLRに関係してくるTransactionScopeクラスを取り上げます。System.Transactions名前空間の詳細はMSDN2ドキュメントを参照してください。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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