Compartir vía


CommittableTransaction.Commit Método

Definición

Intenta confirmar la transacción.

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

Excepciones

Se llama al método Commit() en una transacción y la transacción pasa a ser InDoubt.

Se llama al método Commit() y se deshace la transacción por primera vez.

Comentarios

Cuando se llama a este método, se sondean todos los objetos que se han registrado para participar en la transacción y pueden indicar de forma independiente su voto para confirmar o revertir la transacción. Si algún participante vota para revertir la transacción, se revierte y este método produce una TransactionException excepción. Se trata de una repetición normal para una transacción y el código debe detectar y procesar estas excepciones.

Commit y EndCommit se bloquean hasta que se complete la primera fase del procesamiento de transacciones. La primera fase finaliza después de que todos los administradores de recursos y las inscripciones en la transacción hayan votado sobre el resultado de la transacción y el TransactionManager ha decidido confirmar o anular la transacción. La segunda fase del procesamiento siempre es asincrónica. Por lo tanto, no hay ninguna garantía de que los datos confirmados desde dentro de una transacción determinada estarán disponibles inmediatamente después cuando no usen otra transacción para ver estos datos.

Dado que este método se bloquea hasta que se completa la primera fase del procesamiento de transacciones, debe tener mucho cuidado al usar este método en una aplicación de formulario de Windows (WinForm) o se puede producir un interbloqueo. Si llamas a este método dentro de un evento WinForm Control (por ejemplo, haciendo clic en un botón) y usas el método sincrónico Invoke para dirigir el control para realizar algunas tareas de interfaz de usuario (por ejemplo, cambiar colores) en medio del procesamiento de la transacción, se producirá un interbloqueo. Esto se debe a que el Invoke método es sincrónico y bloquea el subproceso de trabajo hasta que el subproceso de interfaz de usuario finaliza su trabajo. Sin embargo, en nuestro escenario, el subproceso de interfaz de usuario también espera a que el subproceso de trabajo confirme la transacción. El resultado es que ninguno puede continuar y el ámbito espera indefinidamente para que finalice la confirmación. Debe usar BeginInvoke en lugar de Invoke siempre que sea posible, ya que es asincrónico y, por tanto, menos propenso a interbloqueo.

Se aplica a