CommittableTransaction.Commit Método

Definição

Tenta confirmar a transação.Attempts to commit the transaction.

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() is called on a transaction and the transaction becomes InDoubt.

Commit() é chamado e a transação é revertida pela primeira vez.Commit() is called and the transaction rolls back for the first time.

Comentários

Quando esse método é chamado, todos os objetos que foram registrados para participar da transação são sondados e podem indicar de forma independente seu voto para confirmar ou reverter a transação.When this method is called, all objects that have registered to participate in the transaction are polled and can independently indicate their vote to either commit or roll back the transaction. Se qualquer participante tiver votos de reverter a transação, ele será revertido e esse método lançará uma TransactionException exceção.If any participant votes to roll back the transaction, it is rolled back and this method throws a TransactionException exception. Essa é uma ocorrência normal para uma transação e seu código deve capturar e processar essas exceções.This is a normal occurrence for a transaction and your code should catch and process such exceptions.

Commit e EndCommit o bloco até que a primeira fase de processamento da transação seja concluída.Commit and EndCommit block until the first phase of transaction processing is complete. A primeira fase termina depois que todos os gerenciadores de recursos e as inlistagens na transação tiverem votado o resultado da transação e o TransactionManager permanentemente tiver decidido confirmar ou anular a transação.The first phase ends after all resource managers and enlistments in the transaction have voted on the transaction outcome and the TransactionManager has durably decided to commit or abort the transaction. A segunda fase do processamento é sempre assíncrona.The second phase of processing is always asynchronous. Portanto, não há nenhuma garantia de que os dados que apenas confirmados em uma determinada transação estarão imediatamente disponíveis posteriormente quando não estiver usando outra transação para exibir esses dados.Therefore, there is no guarantee that data just committed from within a given transaction will be immediately available afterwards when not using another transaction to view this data.

Como esse método é bloqueado até que a primeira fase do processamento de transações seja concluída, você deve ser extremamente cuidadoso ao usar esse método em um aplicativo Windows Form (WinForm) ou pode ocorrer um deadlock.Because this method blocks until the first phase of transaction processing is complete, you should be extremely careful when using this method in a Windows Form (WinForm) application, or a deadlock can occur. Se você chamar esse método dentro de um evento de controle do WinForm (por exemplo, clicar em um botão) e usar o Invoke método síncrono para direcionar o controle para executar algumas tarefas de interface do usuário (por exemplo, alterar as cores) no meio do processamento da transação, ocorrerá um deadlock.If you call this method inside one WinForm Control event (for example, clicking a button), and use the synchronous Invoke method to direct the control to perform some UI tasks (for example, changing colors) in the middle of processing the transaction, a deadlock will happen. 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.This is because the Invoke method is synchronous and blocks the worker thread until the UI thread finishes its job. No entanto, em nosso cenário, o thread da interface do usuário também está aguardando que o thread de trabalho confirme a transação.However, in our scenario, the UI thread is also waiting for the worker thread to commit the transaction. O resultado é que nenhum é capaz de prosseguir e o escopo aguarda indefinidamente para que a confirmação seja concluída.The result is that none is able to proceed and the scope waits indefinitely for the Commit to finish. Você deve usar BeginInvoke , em vez de Invoke sempre possível, porque é assíncrono e, portanto, menos propenso a deadlock.You should use BeginInvoke rather than Invoke wherever possible, because it is asynchronous and thus less prone to deadlock.

Aplica-se a