前回、Webサービスでのトランザクション処理の問題に遭遇したため、プログラムのデバッグ中にOracleConnectionの接続文字列のenlist設定について偶然興味深い発見をしました。
以前に記事を読んだのですが、その内容を思い出せません。その記事では、enlist を false に設定するのが最適であると書かれていました。なぜ false に設定する必要があるのかについては詳しく説明しませんでした。私のプログラム、 enlist=false は直接書かれました。参加の設定とトランザクションの処理の間には微妙な関係があることに今になって気づきました。
トランザクション マネージャーは一般に 2 つの方法を使用して管理します。1 つは LTM と呼ばれるライトウェイト トランザクション管理と呼ばれるもので、もう 1 つは oleX TM と呼ばれます。単純フェーズのサブミットではLTMが使われるのが一般的ですが、分散トランザクション処理では2PCが使われることが多いため、oleX TM を使用する方式となります。
enlist=false の場合、後続のトランザクションは現在のトランザクションに登録されないため、現在のトランザクションはトランザクションのルートにはなりません。プログラム内で分散トランザクション処理を使用している場合、正しく実行されない可能性があります(テストはしていません)。この時点で、プログラムは TM に LTM を使用して管理するように指示します。
enlist=true の場合、Oracle データベースが使用されている場合、接続文字列に enlist=true が設定されている場合、プロセスは oleX TM を使用して管理する必要があることを TM に伝えます。 oramts.dll を呼び出すときに、MTS for Oracle サービスが開発環境にインストールされていない場合は、oramts.dll が見つからないというメッセージが表示されます。このサービスのインストール パッケージは Oracle の Web サイトからダウンロードできます。なぜ Oracle が個別のインストール パッケージを提供せず、odac にバンドルされてダウンロードするのかはわかりません。
enlist を設定しないとどうなりますか?これは、プログラムが分散トランザクションを使用するか、一般的なトランザクション処理を使用するかによって異なります。 TM はプログラムの要求に従って自動的に反応します。
結論: enlist はトランザクションの登録をある程度制御できます。私の説明が間違っている場合は、修正してください。
リンクアドレス:http: //yanrongpi.cnblogs.com/archive/2006/07/13/450189.html