n階層システム設計の考慮点

第7回 データレイヤの設計について

この記事を読むのに必要な時間:およそ 6.5 分

③ トランザクション制御について

データアクセスロジックコンポーネントを設計する上で一番注意しなければならないことはトランザクション制御です。

以下にトランザクションの種類とその利点,欠点を説明します。

データベース トランザクション

これはデータベース内で閉じるストアドプロシージャ等で使用されます。Microsoft社はストアドプロシージャの利用を下記の理由から推奨しています。

  • データアクセスの高速化が期待できる
  • データベース外部からは条件・値の受け渡しのみなので,セキュリティ保護しやすい
  • ストアドプロシージャの変更に関しては戻り値を変更しない限りデータベース内変更のみですむ
  • アプリケーションとデータベース間のやり取りが少ないので,ネットワークの状態に左右されにくい
  • SQL Server 2005以降ではCLRに対応した言語でロジックが記述できる
  • このため,可読性と生産性が向上できる
  • ストアドプロシージャは高速かつ便利であるが,保守性が損なわれるので使い過ぎないようにする
  • データベースの操作は早くても,すべてのデータをアプリケーションに渡していては速度も遅くなるので,必要なデータのみを渡すようにする
  • 内部でパラメータによりSQL文を組み立てる場合,SQLインジェクションに対応できるように設計する
  • エラー発生時にはエラーコードを呼び出し元に返すように設計する

長所としてはデータベース内に閉じられるため,パフォーマンスがよくなります。短所としては単一のデータベースの操作に限られることがあげられます。

また,各データベース用のストアドプロシージャ言語を習得する必要があり,難易度が高くなります。

手動トランザクション

これは一般的に行われている手法で,データベースのConnectionオブジェクトでトランザクションを生成します。

長所としては,設計がとても簡単で初心者でも設計しやすいです。また,明示的にトランザクションを生成・管理しているので,トランザクションスコープが分かりやすく設計できます。

短所としては,生成したトランザクションがクラスやメソッドをまたがる場合,トランザクションオブジェクトを渡すように設計する必要があります。そのため,機能的に冗長性が発生することがあります。また,トランザクションが複数の分散リソースにわたっている場合では,MS DTC関連の設計,環境構築や設定がアプリケーション設計,構築が必要になります。テスト時にもMS DTCが稼働している必要があり,テスト工数が増大する可能性がります。

自動トランザクション

Microsoft Distributed Transaction Coordinator(以降MS DTCと略します)を使用してトランザクションを制御する方式です。

長所としては,複数の分散リソースにわたっている場合,複数のデータベース間にまたがった場合のトランザクションを制御できることです。これは種類の異なったデータベースについても使用可能です。また,クラスやメソッドをまたがる場合でもMS DTCがトランザクション制御をするおかげでトランザクションオブジェクトの引き渡しの必要がありません。

短所としては,トランザクションが複数の分散リソースにわたっている場合ではMS DTC関連の設計,環境構築や設定がアプリケーション設計,構築が必要になります。また,テスト時にもMS DTCが稼働している必要があり,テスト工数が増大する可能性がります。

明示的なトランザクション

この場合はSystem.TransactionsのCommittableTransactionを使用して明示的にトランザクション管理を行います。ただし,トランザクションが複数の分散リソースにわたっている場合ではMS DTCを使用してトランザクションを制御する方式です。

本方式ではトランザクションをコミットまたは中止するためには必ずCommitメソッドもしくはRollbackメソッドを呼び出す必要があります。これらのメソッドが呼び出されない場合,トランザクションに参加するリソースはロックされ続けます。

長所としては,設計がとても簡単で初心者でも設計しやすいです。また,明示的にトランザクションを生成,管理しているので,トランザクションスコープが分かりやすく設計できます。

短所としては,生成したトランザクションがクラスやメソッドをまたがる場合,トランザクションオブジェクトを渡すように設計する必要があります。そのため,機能的に冗長性が発生することがあります。

暗黙的なトランザクション

この場合はSystem.TransactionsのTransactionScopeを使用して暗黙的にトランザクション管理を行います。ただし,トランザクションが複数の分散リソースにわたっている場合ではMS DTCを使用してトランザクションを制御する方式です。

本方式ではTransactionScopeを初期化してからDisposeメソッドの呼び出しまでの間で例外が発生しなかった場合,TransactionScopeが参加しているトランザクションを続行できます。TransactionScope内で例外が発生した場合,TransactionScopeが参加しているトランザクションはロールバックされます。TransactionScope内で正常に終了した場合,Complete メソッドを呼び出し,トランザクションを終了させます。Complete メソッドを呼び出さず,アプリケーションが終了した場合は,TransactionScopeが参加しているトランザクションはロールバックされます。

長所としては,設計がとても簡単で初心者でも設計しやすいです。また,複数のデータベース間にまたがったトランザクションを制御できることです。

短所としては,トランザクションが複数の分散リソースにわたっている場合ではMS DTC関連の設計,環境構築や設定がアプリケーション設計,構築が必要になります。

また,テスト時にもMS DTCが稼働している必要があり,テスト工数が増大する可能性がります。

Microsoft社はMSDN Libraryでは暗黙的なトランザクションを使用することを推奨しています。

確かにデータアクセスロジックコンポーネントはその中で閉じることができる単一データソースへの操作のトランザクションルートとなる場合もあります。しかし,ほとんどの場合,ビジネスレイヤで生成されたトランザクション内からの呼び出しのほうが多いと思います。そのため,私はどちらにトランザクションルートがあっても同様な設計となる暗黙的なトランザクションを用いて設計することを推奨します。

以下の表に暗黙的トランザクションのTransactionScopeOptionオプションによる状態の変化を示します。

表1 TransactionScopeOptionオプションによる状態の変化

TransactionScopeOption アンビエントトランザクション スコープが参加するトランザクション
Required なし 新しいトランザクション(ルートになる)
RequiresNew なし 新しいトランザクション(ルートになる)
Suppress なし トランザクションなし
Required あり アンビエントトランザクション
RequiresNew あり 新しいトランザクション(ルートになる)
Suppress あり トランザクションなし

アンビエントトランザクション:アンビエントトランザクションとは,実際にコードが実行されるトランザクションのこと。

(出典:Miceosoft社 MSDNライブラリ)

著者プロフィール

露木敏博(つゆきとしひろ)

1966年神奈川県横浜市生まれ。1990年,株式会社日立システムアンドサービス(旧日立システムエンジニアリング株式会社)に入社。

流通系SE,営業所駐在SEなどを経て,2003年から生産技術部門で.NET技術に関する技術支援業務に携り,.NET技術に関する各種基準書および標準化,設計ガイドなどを作成。

マイクロソフトMVPアワードプログラムよりDevelopment Platforms - ASP/ASP.NETのカテゴリで2008年7月よりMVPアワードを受賞。