自動トランザクション逆に、マニュアルトランザクションでは記述しづらい複数のクラスにまたがるSQL処理の1トランザクション化や、マニュアルトランザクションでは記述することのできない複数のデータベースにまたがるSQL処理の1トランザクション化が求められる場合には、以下に解説する自動トランザクションを利用するとよい。自動トランザクションの概要を図3-9に示す。OSの基盤サービスの1つである分散トランザクションコーディネータ(MS-DTC)との連携処理が行われる。これによって生成されるトランザクションコンテキストを利用すると、当該トランザクションコンテキスト内から実施されたすべてのSQL処理を1つのトランザクションに束ねてしまうことができる。自動トランザクションの例なお、図3-9はアプリケーション設計としては適切なものではないが※11、ここでは他のトランザクション方式との比較のために最も簡単な例として用いることとした。詳細は本書第2部「自動トランザクション処理」にて解説するので、まずは自動トランザクション制御の大まかな全体像を掴んで頂きたい。図3-9ではユーザインタフェースコンポーネントがトランザクションコンテキストを生成しているが、これは設計観点からすると不適切である。本来は、ビジネスロジックコンポーネントからトランザクションコンテキストを生成すべきである。Webページのページディレクティブを用いてトランザクションコンテキスト生成を指定し、ContextUtilクラスを用いてコミットとアボートを指示するというものである。行うべき作業は以下の3つである(前述の通り、ここに示すコードは設計的に見て不適切なものであるため、スペースの都合上、C#のコードのみ示しておく)。.aspxのページディレクティブの1つであるtransaction属性としてRequiresNewを指定する(図3-10およびリスト3-4)。このページから呼び出される下位のクラスやメソッド内部では、マニュアルトランザクション制御は不要である(リスト3-5)。コネクションをオープンし、SQL文を発行し、コネクションをクローズするだけでよい。ページ処理を完了する前に、コミットまたはアボート(ロールバック)を指定する(リスト3-6)。"振り替え処理を正しく完了しました。"振り替え処理ができなかったため、処理を元に戻しました。)命令の発行)は一切行う必要がない。ADO.NETのSqlConnectionオブジェクトは、自身がトランザクションコンテキスト内でオープンされた場合には、自動的に当該トランザクションに参加する機能を備えているからである。このため自動トランザクションを用いれば、マニュアルトランザクションでは記述しにくかった、複数のクラスあるいは複数のメソッドにまたがるSQL処理の1トランザクション化を容易に実現できる。Server)に対して行われた処理を1トランザクションに束ねることもできる。MSMQに対する読み書きも、データベースの読み書きとまとめて1つのトランザクションに束ねてくれる。これはマニュアルトランザクションでは記述することができない。自動トランザクションを用いた場合、実際のコミット/アボート制御は分散トランザクションコーディネータであるMS-DTCが行う。Commit)処理と呼ばれる調整作業を実施する。これにより、すべてのデータベース書き込みがまとめてコミットされるか、あるいはアボートされるようになっている※12。2相コミットの詳細やその実施タイミングに関しては、「第2部自動トランザクション処理」で詳細に解説する。メリットとデメリット他のトランザクション制御方式と同様、自動トランザクション制御方式にもメリットとデメリットがある。主なメリット自動トランザクション制御方式を利用すると、マニュアルトランザクション制御方式の問題であった、「1つのデータベース、1つのメソッド内に閉じたトランザクション処理の記述」という制限を打ち破ることができるようになる。第2部で解説するサービスコンポーネントと呼ばれる機能を利用すると、複雑なトランザクションコンテキスト構造を作り、各コンテキストを個別にコミットしたりアボートしたりすることもできる。このため自動トランザクションをうまく利用すれば、クラス分割方法や役割分担などの設計自由度を高められるようになる。保守性の高いアプリケーションを設計するためには適切なクラス分割と役割分担が欠かせないが、自動トランザクションはそれを下支えする技術であるといえる。主なデメリット実際のシステム開発プロジェクトで自動トランザクションを利用する際の最も大きな問題点は、設計難易度の高さである。詳細は第2部で解説するが、自動トランザクションを利用するためには、自動トランザクションの内部制御機構の正しい理解が不可欠である上に、コンポーネント設計(クラス分割)とトランザクション設計(ロックの制御やトランザクションコンテキストの組み方)を同時に考える必要がある。COM+カタログやGACへの事前登録に関連する作業上の煩わしさもある。データベーストランザクションやマニュアルトランザクションに比べると、設計の自由度が高い分、難易度も高く、安易に手を出すと危険である※13。実際のプロジェクトで自動トランザクションを利用する際には、少なくとも以下の2項目を満たしておく必要がある。実際、設計難易度の高さから自動トランザクションの適用を見送ったプロジェクトも数多くある。逆に、自動トランザクションを十分に理解せずに利用したため、トランザクション制御が破綻して失敗したプロジェクトもある。自動トランザクションを利用するためには、データベースやその接続ドライバが分散トランザクションコーディネータ(MS-DTC)に対応していることも必要である。Serverの場合には問題ないが、OracleやDB2などを利用する場合、利用する接続ドライバの種類やバージョンによってはMS-DTCに対応していない場合がある。以上のような理由から、自動トランザクションによる短時間トランザクション制御は、以下のような特性を持つアプリケーションに適していると言える※14。自動トランザクションを利用する場合、トランザクションのコミットやアボートの制御をMS-DTCが実施するため、若干のパフォーマンスオーバヘッドがある。実際の業務アプリケーションでは、「処理全体の時間」に比べると、MS-DTCによるパフォーマンスオーバヘッドはさほど大きくないことも多い。このため業務アプリケーションの特性によって、このオーバヘッドがどの程度致命的になるのかが異なってくる。サービスコンポーネントを用いたアプリケーション設計時の注意点」にて議論する。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。