トランザクションの定義
トランザクションとは、データベース テーブルの中の任意のレコードを変更することを指します。レコードの挿入、更新、または削除はトランザクションと呼ばれます。一方、読み出しのためにレ コードを選択する操作は、データベース内に何の変化も生じさせないので、トランザクションではありません。
ビジネス ルールによっては、複数の変更のグループを 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 を使って、分散トランザクション システムの構築は簡単に出来ます。ただし、分散トランザクションは複数のデータベース間でデータの整合性を取りますが、速度はより遅い、運用も手間が掛かります。パフォーマンスと運用も考慮し、本当に必要な場合だけ、分散トランザクションにしましょう。 |