CommittableTransaction.Commit メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
トランザクションのコミットを試みます。
public:
void Commit();
public void Commit();
member this.Commit : unit -> unit
Public Sub Commit ()
例外
Commit() が呼び出され、トランザクションが初めてロールバックされます。
注釈
このメソッドが呼び出されると、トランザクションに参加するために登録されているすべてのオブジェクトがポーリングされ、トランザクションのコミットまたはロールバックに対する投票を個別に示すことができます。 参加者がトランザクションのロールバックに投票した場合、トランザクションはロールバックされ、このメソッドは TransactionException 例外をスローします。 これはトランザクションの通常の発生であり、コードはそのような例外をキャッチして処理する必要があります。
Commit を EndCommit 、トランザクション処理の最初のフェーズが完了するまでブロックします。 最初のフェーズは、トランザクション内のすべてのリソース マネージャーと参加リストがトランザクションの結果に投票し、 TransactionManager がトランザクションのコミットまたは中止を永続的に決定した後に終了します。 処理の 2 番目のフェーズは常に非同期です。 したがって、別のトランザクションを使用してこのデータを表示しない場合、特定のトランザクション内からコミットされたデータがすぐに使用できるようになるという保証はありません。
このメソッドは、トランザクション処理の最初のフェーズが完了するまでブロックするため、Windows フォーム (WinForm) アプリケーションでこのメソッドを使用する場合、またはデッドロックが発生する可能性がある場合は、非常に注意する必要があります。 1 つの WinForm Control イベント内でこのメソッドを呼び出し (ボタンをクリックするなど)、同期 Invoke メソッドを使用して、トランザクションの処理中にいくつかの UI タスク (色の変更など) を実行するようにコントロールに指示すると、デッドロックが発生します。 これは、 Invoke メソッドが同期的であり、UI スレッドがそのジョブを完了するまでワーカー スレッドをブロックするためです。 ただし、このシナリオでは、UI スレッドもワーカー スレッドがトランザクションをコミットするのを待機しています。 その結果、何も続行できず、スコープはコミットが完了するまで無期限に待機します。 可能な限りBeginInvokeではなく、Invokeを使用する必要があります。これは非同期であり、デッドロックが発生しにくくなるためです。