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 예외를 throw 합니다.If any participant votes to roll back the transaction, it is rolled back and this method throws a TransactionException exception. 이 트랜잭션에 대 한 일반적으로 발생 하 고 코드를 catch 하 고 이러한 예외를 처리 해야 합니다.This is a normal occurrence for a transaction and your code should catch and process such exceptions.

CommitEndCommit는 트랜잭션 처리의 첫 번째 단계가 완료 될 때까지 차단 됩니다.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. 처리의 두 번째 단계는 항상 비동기입니다.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 Form (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. 하나의 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.

적용 대상