5年ぶりのメジャーバージョンアップとなったSQL Server 2005。本連載では、SQL Server 2005への移行を検討しているデータベース管理者に向け、新規に実装されたさまざまな機能の詳細を紹介していく。(編集局)
--Page 1--
SQL CLRでのトランザクション管理
--Page 2--
TransactionScopeによる分散トランザクション管理
--Page 3--
SQL CLRを実際のプロジェクトでどのように生かすか
まとめ
これまで第4〜6回の3回にわたってお送りしてきた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); } }
上記のサンプルでは、必須項目へのnull値設定によりSQLエラーが発生し、トランザクションがロールバックされます。ADO.NETによるトランザクション管理と実装方法に違いはありません。トランザクションは接続(SqlConnection)ごとにひも付いており、複数のデータベースへの処理を管理することはできません。
SQL CLRはローカルサーバと外部サーバへの処理を一括で行えるところが利点であり、また、SQL CLRで書かれたオブジェクト自体が複数のオブジェクトから呼ばれるため、これまでのトランザクション管理方法ではこれらの機能には力不足です。そこで登場したのがSystem.Transactionsによる分散トランザクションです。
System.Transactionsは.NET Framework 2.0で新たに実装された名前空間です。ローカル型/分散型のトランザクションをサポートしており、従来のトランザクション管理に比べて、シンプルで効率の良いトランザクションのプログラミングが可能となります。
System.Transactions名前空間は、非常に多様なクラスやインターフェイスをサポートしていますが、ここではSQL CLRに関係してくるTransactionScopeクラスを取り上げます。System.Transactions名前空間の詳細はMSDN2ドキュメントを参照してください。
Copyright © ITmedia, Inc. All Rights Reserved.