다음을 통해 공유


CommittableTransaction.Commit 메서드

정의

트랜잭션을 커밋하려고 시도합니다.

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

예외

Commit()이 트랜잭션에서 호출되고 트랜잭션이 InDoubt가 되는 경우

Commit()이 호출되고 트랜잭션이 처음으로 롤백된 경우

설명

이 메서드가 호출되면 트랜잭션에 참여하도록 등록된 모든 개체가 폴링되고 트랜잭션을 커밋하거나 롤백하기 위해 투표를 독립적으로 나타낼 수 있습니다. 참가자가 트랜잭션을 롤백하도록 투표하면 롤백되고 이 메서드는 예외를 TransactionException throw합니다. 이는 트랜잭션에 대해 일반적으로 발생하며 코드는 이러한 예외를 catch하고 처리해야 합니다.

Commit 트랜잭션 EndCommit 처리의 첫 번째 단계가 완료될 때까지 차단합니다. 첫 번째 단계는 트랜잭션의 모든 리소스 관리자 및 인리스트먼트가 트랜잭션 결과에 투표하고 TransactionManager 트랜잭션을 커밋하거나 중단하기로 결정한 후에 종료됩니다. 처리의 두 번째 단계는 항상 비동기입니다. 따라서 이 데이터를 보기 위해 다른 트랜잭션을 사용하지 않을 때 지정된 트랜잭션 내에서 커밋된 데이터를 나중에 즉시 사용할 수 있다는 보장은 없습니다.

이 메서드 차단 트랜잭션 처리의 첫 번째 단계 완료 될 때까지, 매우 주의 해야 애플리케이션을 Windows Form (WinForm) 또는 교착 상태에서이 메서드를 사용 하는 경우 발생할 수 있습니다 때문에. 하나의 WinForm Control 이벤트(예: 단추 클릭)에서 이 메서드를 호출하고 동기 Invoke 메서드를 사용하여 트랜잭션 처리 도중에 일부 UI 작업(예: 색 변경)을 수행하도록 컨트롤을 지시하는 경우 교착 상태가 발생합니다. 이는 메서드가 Invoke 동기적이며 UI 스레드가 작업을 완료할 때까지 작업자 스레드를 차단하기 때문입니다. 그러나 이 시나리오에서는 UI 스레드가 작업자 스레드가 트랜잭션을 커밋하기를 기다리고 있습니다. 그 결과 아무도 진행할 수 없으며 범위는 커밋이 완료될 때까지 무기한 대기합니다. 비동기적이므로 교착 상태가 발생하기 쉽기 때문에 가능한 경우 대신 사용해야 BeginInvoke Invoke 합니다.

적용 대상