CommittableTransaction.Commit Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Tenta comprometer a transação.
public:
void Commit();
public void Commit();
member this.Commit : unit -> unit
Public Sub Commit ()
Exceções
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.