DotNet 2.0 と SqlServer 2005 による分散トランザクション処理
蒋 いつ峰 2008/06/12   |  .NET
DotNet 2.0 と SqlServer 2005 による分散トランザクション処理 2008/06/12  |  PK:分散トランザクション DotNet SqlServer

トランザクションの定義

トランザクションとは、データベース テーブルの中の任意のレコードを変更することを指します。レコードの挿入、更新、または削除はトランザクションと呼ばれます。一方、読み出しのためにレ コードを選択する操作は、データベース内に何の変化も生じさせないので、トランザクションではありません。

ビジネス ルールによっては、複数の変更のグループを 1 つのトランザクションとして扱うことが必要となります。例えば、会計ソフトウェアでは、借方と貸方への入力はともに成功するか失敗するかのどちらかでなく てはなりません。借方への入力が成功して貸方への入力が失敗すると、残高がおかしくなります。

この種の、残高を意識しなくてはならない変更は、全体として 1 つのトランザクションを表しています。トランザクションの中でエラーが発生した場合には、トランザクション全体をロールバックしなくてはなりません。

 

分散トランザクションの定義

分散トランザクションには複数のデータベースが関与します。例えば、本部データベースと支店データベース両方のテーブルを一つのトランザクションで更新し た場合、このトランザクションが分散トランザクションになります。また、分散トランザクションと違う、普通のトランザクションはローカル トランザクションとも呼ばれます。

複数のローカル トランザクションを纏めて一括コミットまたはロールバックする処理もありますが、これは分散トランザクションと違います。複数のコミットまたはロールバックの間、エラーが発生しデータの整合性が取れない可能性がありますから。

 

 分散トランザクションにする前

分散トランザクションを適用するには、DBサーバとクライアントの構成が必要となります、セキュリティと運用の利便性を考慮し、分散かローカルか決めます。

・DBサーバの構成

 MSDTCのセキュリティ設定を変更します。

・クライアントの構成

 MSDTCのセキュリティ設定を変更します、ファイアウォールでMSDTCプログラムとポート135を許可します。

具体的には、www.logistech.co.jp/techtips/msdtc.html を参照します。

参考:support.microsoft.com/kb/839279

 

分散トランザクションの実装

ADO.NET、T/SQL どちらもトランザクションが対応していますが、1 つのデータベースにのみ適用されます。

分散トランザクションの場合、COM+ サービスを使用して管理しなければなりません。従いまして、処理の速度はローカル トランザクションより遅いです。DotNet 2.0 以前、分散トランザクションを適用するためには、System.EnterpriseServices 名前空間を使用しなければなりません。

DotNet 2.0 は System.Transactions を導入し、高パフォーマンスな分散トランザクションを簡単に実装できま。

※以下の参考ソースは説明のための仮ソースであります。

1.接続文字列

  分散トランザクションのコネクションの接続文字列は、「Enlist」プロパティを「true」にする必要があります。

  ・ローカル トランザクションの接続文字列

  connectionString = "Data Source=ServerName;Initial Catalog=DBName;Connect Timeout=30;MultipleActiveResultSets=true;Enlist=false;User Id=UserID;PWD=Password"

  ・分散トランザクションの接続文字列

  connectionString = "Data Source=ServerName;Initial Catalog=DBName;Connect Timeout=30;MultipleActiveResultSets=true;Enlist=true;User Id=UserID;PWD=Password"

 

2.SQLコマンドの発行

  ローカル トランザクション環境でSQL更新を実行するには、コマンドのトランザクションを指定する必要がありますが、分散化トランザクションの場合は要りません。

  ・ローカル トランザクションのSQLコマンドの発行

     Dim cmd As New SqlCommand(sqlText, GetConnection())
     cmd.CommandType = CommandType.Text
     cmd.Transaction = getTransaction()
     cmd.ExecuteNonQuery()

・分散トランザクションのSQLコマンドの発行

     Dim cmd As New SqlCommand(sqlText, GetConnection())
     cmd.CommandType = CommandType.Text
     cmd.ExecuteNonQuery()

 

3.トランザクションの制御とリソース開放

  ローカル トランザクションの制御は SqlTransaction オブジェクトの Commit() と Rollback() を使いますが、分散トランザクションの場合は、トランザクションをシステムで管理するので、これらのメソッドは使いません。代わりに、TransactionScope を利用してトランザクションを制御します。TransactionScope の Complete() が呼ばれればコミットします、呼ばれなければロールバックします。

  ローカル トランザクションのリソース開放は SqlConnection、SqlTransaction、SqlDataReader それぞれを閉じますが、分散トランザクションの場合は、SqlTransaction の開放は要りません。

  ・ローカル トランザクションの制御とリソース開放

    Try
          ExecuteReader()
          ExecuteUpdate()
          GetTransaction.Commit()
    Catch ex As System.Exception
          GetTransaction.Rollback()
    Finally
          GetReader().Close()
          GetConnection().Close()
          SetTransaction(Nothing)
    End Try

  ・分散トランザクションの制御とリソース開放

    Try
          Using scope As New TransactionScope
                ExecuteReader()
                ExecuteUpdate()
                ’コミット
                scope.Complete()
          End Using
    Catch ex As System.Exception
          ’自動的にロールバック
    Finally
          GetReader().Close()
          GetConnection().Close()
    End Try

 

まとめ

DotNet 2.0 と SqlServer 2005 を使って、分散トランザクション システムの構築は簡単に出来ます。ただし、分散トランザクションは複数のデータベース間でデータの整合性を取りますが、速度はより遅い、運用も手間が掛かります。パフォーマンスと運用も考慮し、本当に必要な場合だけ、分散トランザクションにしましょう。


コメント  |  目次

 
ヘルプ  |  ご利用規約  |  相互リンク  |  問合せ
リンクはご自由に、問合せはお気軽に
©2007 Uprush