トランザクション メッセージ処理
更新 : 2007 年 11 月
トランザクション処理により、トランザクション内のメッセージが正しい順序で一度だけ配信され、送信先のキューから正しく取得できるようになります。MessageQueue コンポーネントを使用すると、メッセージをトランザクションによって送受信できます。トランザクション内でメッセージを送信するときには、いくつかの関連するメッセージをグループ化します。トランザクション内のメッセージは、すべて送信された順番で一緒に配信されます (トランザクションのコミット)。または、なんらかの問題が発生すると自動的にすべてのメッセージが送受信されなくなります (トランザクションの中止)。
アプリケーションから作成できる主なトランザクションの種類には、次の 2 種類があります。
内部トランザクションは、複数のメッセージ キュー リソースの間、つまり、メッセージ キュー エンタープライズに属する 2 つのキュー間でメッセージを送信するために使用されます。
外部トランザクションは、キューとそれ以外のリソース (データベースなど) との間でメッセージを送信するために使用されます。
内部トランザクションと外部トランザクションでは、プログラミング モデル、トランザクションを管理するリソース マネージャ、および使用パターンがそれぞれ異なります。
内部トランザクション
内部トランザクションは、MessageQueueTransaction クラスのインスタンスを作成し、それを MessageQueue コンポーネントのインスタンスに関連付けることによって実行されます。内部トランザクションは、最も単純な種類のトランザクションです。複数のメッセージ キューの間でメッセージが送信されます。実際に行われる処理は、メッセージ キューのトランザクション コーディネータが管理します。プロセス内のこれらの手順は手動で管理するため、内部トランザクションは、手動トランザクションまたは明示的なトランザクションと考えることができます。一方、外部トランザクションは、自動トランザクションまたは暗黙のトランザクションと考えることができます。
内部トランザクションのプログラミング モデルは簡単です。MessageQueueTransaction クラスの Begin メソッドを呼び出し、このクラスのインスタンスを送信用または受信用のメソッドに渡します。その後、Commit メソッドを呼び出してトランザクションの変更を目的のキューに保存します。詳細については、「方法 : 内部トランザクション内でメッセージを送信する」を参照してください。
内部トランザクションは、データベースなどの非メッセージ キュー リソースに対してはトランザクションを実行できないという点で、機能的にやや制限されています。トランザクションでデータベースとやり取りするには、外部トランザクションを使用する必要があります。ただし、このような制限はありますが、内部トランザクションは外部トランザクションよりも良好なパフォーマンスを提供します。
内部トランザクションと外部トランザクションのどちらの場合も、トランザクションを使用するように設定されたキューにメッセージを送信する必要があります。詳細については、「方法 : トランザクション キューを作成する」を参照してください。
外部トランザクション
一般に、外部トランザクションは、キューとそれ以外の種類のリソースとの間でメッセージを送信するときに使用します。たとえば、キューからメッセージを取得してデータベースに送信したり、データベースからメッセージを取得してキューに送信したりする場合などです。外部トランザクションは、いくつかの点で内部トランザクションと異なっています。
外部トランザクションは、メッセージ キュー システムの一部ではないコーディネータに依存しています。ほとんどの場合、これは Microsoft 分散トランザクション コーディネータ (DTC: Distributed Transaction Coordinator) です。DTC は、トランザクション内で必要なリソースを確保します。また、トランザクション内のすべての処理が全体として成功したか失敗したかを決定するプロセスを管理します。
外部トランザクションのプログラミング モデルは、内部トランザクションよりも複雑です。単に Begin、Commit、および Abort を呼び出す代わりに、外部トランザクションを示す属性を指定し、コンポーネントを COM+ 1.0 Services に登録する必要があります。また、トランザクションの種類を指定するパラメータを取る特別な形式の Send メソッドおよび Receive メソッドを使用し、このフィールドを Automatic に設定する必要があります。
MessageQueue コンポーネントを使用しないで送信できる別の種類のトランザクションもあります。Visual Studio または .NET Framework でのトランザクションの詳細については、次のトピックを参照してください。
内容 |
参照項目 |
---|---|
外部トランザクションで使用される属性を示す例 |
MSDN オンラインを参照してください。 |
C++ でのトランザクション |