CommittableTransaction.Commit Método

Definição

Tenta comprometer a transação.

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

Exceções

Commit() é chamado numa transação e a transação torna-se InDoubt.

Commit() é chamada e a transação reverte pela primeira vez.

Observações

Quando este método é chamado, todos os objetos que se registaram para participar na transação são inquiridos e podem indicar independentemente o seu voto para comprometer ou reverter a transação. Se algum participante votar para reverter a transação, esta é revertida e este método cria uma TransactionException exceção. Isto é uma ocorrência normal numa transação e o seu código deve detetar e processar tais exceções.

Commit e EndCommit bloquear até que a primeira fase do processamento das transações esteja concluída. A primeira fase termina depois de todos os gestores de recursos e recrutamentos na transação terem votado no resultado da transação e TransactionManager decidido de forma permanente comprometer-se ou abortar a transação. A segunda fase do processamento é sempre assíncrona. Portanto, não há garantia de que os dados recém-comprometidos dentro de uma dada transação estejam imediatamente disponíveis depois de não usar outra transação para visualizar esses dados.

Como este método bloqueia até que a primeira fase do processamento das transações esteja concluída, deve ter muito cuidado ao utilizá-lo numa aplicação Windows Form (WinForm), caso contrário pode ocorrer um bloqueio. Se chamar este método dentro de um evento WinForm Control (por exemplo, clicar num botão) e usar o método síncrono Invoke para direcionar o controlo para executar algumas tarefas da interface (por exemplo, mudar cores) a meio do processamento da transação, ocorrerá um bloqueio. Isto porque o Invoke método é síncrono e bloqueia o worker thread até que o UI thread termine o seu trabalho. No entanto, no nosso cenário, o thread UI também está à espera que o thread worker comprometa a transação. O resultado é que nenhum consegue avançar e o alcance espera indefinidamente que o Commit termine. Deves usar BeginInvoke em vez de Invoke sempre que possível, porque é assíncrono e, por isso, menos propenso a deadlocks.

Aplica-se a