CommittableTransaction.Commit 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
트랜잭션을 커밋하려고 시도합니다.
public:
void Commit();
public void Commit();
member this.Commit : unit -> unit
Public Sub Commit ()
예외
Commit() 가 호출되고 트랜잭션이 처음으로 롤백됩니다.
설명
이 메서드가 호출되면 트랜잭션에 참여하도록 등록된 모든 개체가 폴링되며 트랜잭션을 커밋하거나 롤백하기 위한 투표를 독립적으로 나타낼 수 있습니다. 참가자가 트랜잭션을 롤백하도록 투표하면 롤백되고 이 메서드는 예외를 TransactionException throw합니다. 이는 트랜잭션에 일반적으로 발생하며 코드는 이러한 예외를 catch하고 처리해야 합니다.
Commit 트랜잭션 EndCommit 처리의 첫 번째 단계가 완료될 때까지 차단합니다. 첫 번째 단계는 트랜잭션의 모든 리소스 관리자 및 인리스트먼트가 트랜잭션 결과에 투표하고 트랜잭션을 TransactionManager 커밋하거나 중단하기로 결정한 후에 종료됩니다. 처리의 두 번째 단계는 항상 비동기입니다. 따라서 다른 트랜잭션을 사용하여 이 데이터를 않을 때 지정된 트랜잭션 내에서 커밋된 데이터를 즉시 사용할 수 있다는 보장은 없습니다.
이 메서드는 트랜잭션 처리의 첫 번째 단계가 완료될 때까지 차단되므로 winForm(Windows Form) 애플리케이션에서 이 메서드를 사용할 때는 매우 주의해야 합니다. 그렇지 않으면 교착 상태가 발생할 수 있습니다. 한 WinForm Control 이벤트(예: 단추 클릭)에서 이 메서드를 호출하고 동기 메서드를 사용하여 Invoke 트랜잭션을 처리하는 동안 컨트롤에 일부 UI 작업(예: 색 변경)을 수행하도록 지시하면 교착 상태가 발생합니다. 이는 메서드가 Invoke 동기적이며 UI 스레드가 작업을 완료할 때까지 작업자 스레드를 차단하기 때문입니다. 그러나 이 시나리오에서 UI 스레드는 작업자 스레드가 트랜잭션을 커밋할 때까지 대기하고 있습니다. 그 결과 아무도 진행할 수 없으며 범위는 커밋이 완료될 때까지 무기한 대기합니다. 비동기이므로 교착 상태가 발생하기 쉽기 때문에 가능한 경우보다 BeginInvoke 사용해야 Invoke 합니다.