CommittableTransaction.Commit メソッド


トランザクションをコミットしようとします。Attempts to commit the transaction.

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


トランザクションで Commit() が呼び出され、トランザクションが InDoubt の状態になります。Commit() is called on a transaction and the transaction becomes InDoubt.

Commit() が呼び出され、トランザクションが初めてロールバックされます。Commit() is called and the transaction rolls back for the first time.


このメソッドを呼び出すと、トランザクションに参加するように登録されているすべてのオブジェクトがポーリングされ、トランザクションのコミットまたはロールバックのいずれかに投票を個別に示すことができます。When this method is called, all objects that have registered to participate in the transaction are polled and can independently indicate their vote to either commit or roll back the transaction. トランザクションをロールバックするように参加者が投票した場合、その参加要素はロールバックされ、このメソッドは TransactionException 例外をスローします。If any participant votes to roll back the transaction, it is rolled back and this method throws a TransactionException exception. これはトランザクションの通常の発生であり、コードでこのような例外をキャッチして処理する必要があります。This is a normal occurrence for a transaction and your code should catch and process such exceptions.

Commit および EndCommit、トランザクション処理の最初のフェーズが完了するまでブロックされます。Commit and EndCommit block until the first phase of transaction processing is complete. 最初のフェーズは、すべてのリソースマネージャーとトランザクションの参加リストがトランザクションの結果について投票し、TransactionManager がトランザクションのコミットまたは中止を永続的にした後に終了します。The first phase ends after all resource managers and enlistments in the transaction have voted on the transaction outcome and the TransactionManager has durably decided to commit or abort the transaction. 処理の2番目のフェーズは常に非同期です。The second phase of processing is always asynchronous. そのため、このデータを表示するために別のトランザクションを使用しない場合、特定のトランザクション内からコミットされたばかりのデータをすぐに使用できる保証はありません。Therefore, there is no guarantee that data just committed from within a given transaction will be immediately available afterwards when not using another transaction to view this data.

このメソッドは、トランザクション処理の最初のフェーズが完了するまでブロックするので、Windows フォーム (WinForm) アプリケーションでこのメソッドを使用する場合は細心の注意が必要です。または、デッドロックが発生する可能性があります。Because this method blocks until the first phase of transaction processing is complete, you should be extremely careful when using this method in a Windows Form (WinForm) application, or a deadlock can occur. 1つの WinForm コントロールイベント内でこのメソッドを呼び出し (ボタンをクリックするなど)、同期 Invoke メソッドを使用して、トランザクションの処理中に一部の UI タスク (色の変更など) を実行するようコントロールに指示すると、デッドロックが発生します。If you call this method inside one WinForm Control event (for example, clicking a button), and use the synchronous Invoke method to direct the control to perform some UI tasks (for example, changing colors) in the middle of processing the transaction, a deadlock will happen. これは、Invoke メソッドは同期的であり、UI スレッドがジョブを完了するまでワーカースレッドがブロックされるためです。This is because the Invoke method is synchronous and blocks the worker thread until the UI thread finishes its job. ただし、このシナリオでは、UI スレッドもワーカースレッドがトランザクションをコミットするのを待機しています。However, in our scenario, the UI thread is also waiting for the worker thread to commit the transaction. 結果として、何も続行できず、コミットが終了するまでスコープが無期限に待機することになります。The result is that none is able to proceed and the scope waits indefinitely for the Commit to finish. 可能な限り、Invoke ではなく BeginInvoke を使用する必要があります。これは非同期であるため、デッドロックが発生しにくくなるためです。You should use BeginInvoke rather than Invoke wherever possible, because it is asynchronous and thus less prone to deadlock.