Partilhar via


CommittableTransaction.Commit Método

Definição

Tenta confirmar a transação.

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

Exceções

Commit() é chamado em uma transação e a transação se torna InDoubt.

Commit() é chamado e a transação é revertida pela primeira vez.

Comentários

Quando esse método é chamado, todos os objetos registrados para participar da transação são sondados e podem indicar independentemente seu voto para confirmar ou reverter a transação. Se algum participante votar para reverter a transação, ela será revertida e esse método gerará uma TransactionException exceção. Essa é uma ocorrência normal para uma transação e seu código deve capturar e processar essas exceções.

Commit e EndCommit bloqueie até que a primeira fase do processamento de transações seja concluída. A primeira fase termina depois que todos os gerentes de recursos e inscrições na transação votaram no resultado da transação e o TransactionManager administrador decidiu confirmar ou anular a transação. A segunda fase do processamento é sempre assíncrona. Portanto, não há garantia de que os dados apenas confirmados de dentro de uma determinada transação estarão imediatamente disponíveis posteriormente ao não usar outra transação para exibir esses dados.

Como esse método bloqueia até que a primeira fase do processamento de transações seja concluída, você deve ter muito cuidado ao usar esse método em um aplicativo winform (formulário Windows) ou um deadlock pode ocorrer. Se você chamar esse método dentro de um evento do Controle WinForm (por exemplo, clicar em um botão) e usar o método síncrono Invoke para direcionar o controle para executar algumas tarefas de interface do usuário (por exemplo, alterar cores) no meio do processamento da transação, ocorrerá um deadlock. Isso ocorre porque o Invoke método é síncrono e bloqueia o thread de trabalho até que o thread da interface do usuário conclua seu trabalho. No entanto, em nosso cenário, o thread da interface do usuário também está aguardando o thread de trabalho confirmar a transação. O resultado é que nenhum é capaz de prosseguir e o escopo aguarda indefinidamente para que o Commit seja concluído. Você deve usar BeginInvoke em vez de sempre que Invoke possível, porque ele é assíncrono e, portanto, menos propenso a deadlock.

Aplica-se a