次の方法で共有


アトミック トランザクション

BizTalk オーケストレーションは、トランザクションに関する標準的な 'ACID' の概念に従って個別の作業を実行するように設計できます。 このような個別 (アトミック) の作業単位が実行されると、ビジネス プロセスは一貫性のある 1 つの状態から一貫性と持続性のある新しい状態に移行し、他の作業単位から分離された状態になります。 これは通常、トランザクション セマンティクスを使用して作業単位をカプセル化する Scope コンストラクトを使用して行われます。 スコープを使用せずに、オーケストレーション全体をアトミック トランザクションとして定義することもできます。 一方、オーケストレーション自体の設定でトランザクションの種類が長時間トランザクションまたはアトミックに設定されていない限り、スコープをトランザクション スコープとして設定することはできません。 アトミック トランザクションでは、トランザクション更新中にエラーが発生すると部分的な更新は自動的にロールバックされ、トランザクションの影響が除去されます。ただし、トランザクションで行われた .NET 呼び出しの影響は除去されません。 BizTalk オーケストレーションのアトミック トランザクションは、一般に期間が短く、4 つの "ACID" 属性 (原子性、一貫性、分離性、および持続性) を備えている点で、分散トランザクション コーディネーター (DTC) トランザクションに似ています。

  • 原子性

    トランザクションはアトミックな作業単位を表します。 トランザクション内の変更は、すべて実行されるか、まったく実行されないかのどちらかになります。

  • 一貫性

    トランザクションがコミットされたときにシステム内のデータの整合性が失われないようにする必要があります。 トランザクションで実行されるデータ変更の対象となるデータベースがトランザクションの開始前に内部的な一貫性を有していた場合は、トランザクションのコミット時も内部的な一貫性が保たれなければなりません。 このプロパティの確保を担うのは、主にアプリケーション開発者です。

  • 分離

    同時実行トランザクションによって行われた変更は、他の同時実行トランザクションによって行われた変更から分離する必要があります。 独立したトランザクションが複数同時に実行された場合、データベースの内部的な一貫性が損なわれることはありません。これは、トランザクションが順番に実行された場合とまったく同じです。

  • 持続性

    トランザクションのコミット後、既定では、すべての変更結果がシステム内で持続されます。 システム障害が発生しても、変更結果は保持されます。

    BizTalk オーケストレーションで使用されるアトミック トランザクションでは、次に示す分離レベルがサポートされます。

  • コミットされたものを読み取り

    データが読み込まれている間、ダーティ読み込みを防ぐために共有ロックが保持されますが、トランザクションが終了する前にデータを変更できます。このため、読み込みは繰り返されません。また実際には存在しないデータを生成できます。

  • 反復可能読み取り

    他のユーザーがデータを更新できないようにするために、クエリで使用するすべてのデータをロックします。 繰り返し不能な読み取りは回避できますが、ファントム行が発生する可能性はあります。

  • SERIALIZABLE

    範囲ロックが設定され、トランザクションが完了するまで、他のユーザーがデータベースの行の更新や挿入を行うことはできなくなります。

    BizTalk Server、変数、メッセージ、オブジェクトの変更など、アトミック トランザクション内の状態の変更が、トランザクションのコミットメント時にのみアトミック トランザクションの範囲外で確実に表示されるようになります。 中間的な状態変更は、オーケストレーションの他の部分から分離されます。

Note

アトミック トランザクションに Receive 図形、 Send 図形、または オーケストレーションの開始 図形が含まれている場合、対応するアクションはトランザクションがコミットされるまで実行されません。

データに対して完全な ACID プロパティ (たとえば、データを他のトランザクションから分離する必要がある場合) が必要な場合は、アトミック トランザクションのみを使用する必要があります。

アトミック トランザクションが失敗すると、すべての状態がリセットされ、オーケストレーション インスタンスがスコープに入る前の状態に戻ります。 アトミック トランザクションに関して、BizTalk には、(スコープのローカル変数に限らず) すべての変数がトランザクションに参加するというルールがあります。 アトミックなトランザクションで使用されるシリアル化できない変数やメッセージはすべてスコープのローカルで宣言する必要があります。ローカルで宣言されていない場合は、コンパイル時に "変数... はシリアル化可能として設定されていません。" というエラーが発生します。 すべてのアトミック スコープは "同期済み" であると見なされ、オーケストレーション コンパイラは、実際に同期されたキーワード (keyword)がアトミック スコープに使用されている場合、冗長な使用に関する警告を提供します。 共有データの同期は、スコープの先頭からスコープが正常に完了するまで (スコープの末尾における状態の永続化を含む)、または例外ハンドラーの処理が完了するまで (エラーの場合)、継続されます。 補正ハンドラーは同期ドメインには含まれません。

アトミック トランザクションは、タイムアウト値に関連付けることができます。タイムアウト値に達すると、オーケストレーションによってトランザクションが停止され、インスタンスが中断されます。 アトミック トランザクションに受信図形、送信図形、またはオーケストレーションの開始図形が含まれている場合、対応するアクションはトランザクションがコミットされるまで実行されません。

アトミック トランザクションは、ユーザーが意図的に RetryTransactionException を スローしたとき、またはアトミック トランザクションがコミットしようとした時点で PersistenceException が発生した場合に再試行します。 後者は、アトミック トランザクションが分散 DTC トランザクションの一部であり、そのトランザクションの他の参加要素によってトランザクションが停止された場合などに発生する可能性があります。 同様に、トランザクションがコミットしようとしたときにデータベース接続の問題が発生した場合は、 PersistenceException も発生します。 Retry=True を持つアトミック スコープでこれが発生した場合は、最大 21 回再試行されます。 再試行の間隔は、既定では 2 秒になっています (この間隔は変更できます)。 21 回の再試行が使い果たされた後、トランザクションがまだコミットできない場合は、オーケストレーション インスタンス全体が中断されます。 中断されたオーケストレーション インスタンスは手動で再開できます。カウンターはリセットされ、問題が発生したアトミックのスコープの先頭から再実行されます。

Note

RetryTransactionExceptionPersistenceException のみがアトミック スコープの再試行を引き起こす可能性があります。 アトミック スコープで発生した他の例外は、Retry プロパティが True に設定されている場合でも、再試行を引き起こすことはできません。 2 回連続する再試行の間の 2 秒の既定の遅延は、 RetryTransactionException のパブリック プロパティを使用してオーバーライドできます (再試行の原因となる例外の場合)。

アトミック スコープには、他のトランザクションを入れ子にしたり 、Catch - Exception ブロックを含めたりできない他のトランザクションの入れ子に制限があります。

DTC トランザクション

アトミック トランザクションは DTC トランザクションと同じように動作しますが、既定では明示的な DTC トランザクションではありません。 トランザクション内で使用されているオブジェクトが System.EnterpriseServices.ServicedComponents から派生した COM+ オブジェクトであり、分離レベルがトランザクション コンポーネント間で一致している場合は、明示的に DTC トランザクションにすることができます。

Note

アトミック トランザクションに他のトランザクションを含めたり、例外ハンドラーを含めたりすることはできません。

Note

アトミック トランザクションには、一致する送受信アクション (要求と応答のペア、または同じ関連付けセットを使用する送受信) を含めることはできません。

シリアル化できないオブジェクト

オーケストレーション内でシリアル化できないオブジェクトを使用する場合は、必ずアトミック トランザクション内で使用する必要があります。 シリアル化できないオブジェクトをアトミック トランザクションの外部で使用すると、オーケストレーションがエンジンによって永続化されるたびにデータ損失のリスクが発生します。

注意事項

アトミックのスコープはそれぞれ永続化ポイントを表します。これは、永続化ポイントに達するたびにオーケストレーションの状態がデータベースに保存されることを意味します。 Atomic スコープを広範囲に使用すると、オーケストレーションの待機時間が長くなります。 シリアル化できないオブジェクトの作成には、アトミックのスコープの代わりに静的なメソッド呼び出しを使用できます。静的なメソッド呼び出しはアトミックのスコープを必要としないため、永続化ポイントは不要になります。

参照

アトミック トランザクションの使用シナリオ
長時間トランザクション