次の方法で共有


CommittableTransaction.Commit メソッド

定義

トランザクションをコミットしようとします。

public:
 void Commit();
public void Commit ();
member this.Commit : unit -> unit
Public Sub Commit ()

例外

トランザクションで Commit() が呼び出され、トランザクションが InDoubt の状態になります。

Commit() が呼び出され、トランザクションが初めてロールバックされます。

注釈

このメソッドが呼び出されると、トランザクションに参加するために登録されているすべてのオブジェクトがポーリングされ、トランザクションのコミットまたはロールバックに対する投票を個別に示すことができます。 参加者がトランザクションのロールバックに投票した場合、トランザクションはロールバックされ、このメソッドは例外を TransactionException スローします。 これはトランザクションでは通常発生し、コードでこのような例外をキャッチして処理する必要があります。

CommitEndCommit は、トランザクション処理の最初のフェーズが完了するまでブロックします。 最初のフェーズは、トランザクション内のすべてのリソース マネージャーと参加リストがトランザクションの結果に投票し TransactionManager 、トランザクションのコミットまたは中止を永続的に決定した後に終了します。 処理の 2 番目のフェーズは常に非同期です。 したがって、特定のトランザクション内からコミットされたデータが、このデータを表示するために別のトランザクションを使用しない場合、その直後に使用できる保証はありません。

このメソッドは、トランザクション処理の最初のフェーズが完了するまでブロックするため、Windows フォーム (WinForm) アプリケーションでこのメソッドを使用する場合、またはデッドロックが発生する可能性がある場合は、非常に注意する必要があります。 1 つの WinForm Control イベント (ボタンのクリックなど) 内でこのメソッドを呼び出し、同期 Invoke メソッドを使用して、トランザクションの処理中にいくつかの UI タスク (色の変更など) を実行するようにコントロールに指示すると、デッドロックが発生します。 これは、 Invoke メソッドが同期的であり、UI スレッドがジョブを終了するまでワーカー スレッドをブロックするためです。 ただし、このシナリオでは、UI スレッドもワーカー スレッドがトランザクションをコミットするのを待機しています。 その結果、何も続行できず、スコープはコミットが完了するまで無期限に待機します。 非同期であり、デッドロックが発生しにくくなるため、可能な限りではなく Invoke を使用BeginInvokeする必要があります。

適用対象