Freigeben über


CommittableTransaction.Commit Methode

Definition

Versucht, einen Commit für die Transaktion auszuführen.

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

Ausnahmen

Commit() wird für eine Transaktion aufgerufen, und die Transaktion wird zu InDoubt.

Commit() wird aufgerufen, und es wird zum ersten Mal ein Commit der Transaktion ausgeführt.

Hinweise

Wenn diese Methode aufgerufen wird, werden alle Objekte, die für die Teilnahme an der Transaktion registriert sind, abgefragt und können unabhängig davon angeben, ob sie die Transaktion übernehmen oder zurücksetzen möchten. Wenn ein Teilnehmer zum Zurücksetzen der Transaktion stimmt, wird es zurückgesetzt, und diese Methode löst eine TransactionException Ausnahme aus. Dies ist ein normales Vorkommen für eine Transaktion, und Ihr Code sollte solche Ausnahmen erfassen und verarbeiten.

Commit und EndCommit blockieren, bis die erste Phase der Transaktionsverarbeitung abgeschlossen ist. Die erste Phase endet, nachdem alle Ressourcenmanager und Enlistments in der Transaktion über das Transaktionsergebnis abgestimmt haben und die TransactionManager sich dauerhaft entschieden haben, die Transaktion zu übernehmen oder abzubrechen. Die zweite Phase der Verarbeitung ist immer asynchron. Daher gibt es keine Garantie, dass Daten, die nur innerhalb einer bestimmten Transaktion übernommen wurden, sofort verfügbar sind, wenn diese Daten nicht mit einer anderen Transaktion angezeigt werden.

Da diese Methode bis zum Abschluss der ersten Phase der Transaktionsverarbeitung blockiert wird, sollten Sie bei der Verwendung dieser Methode in einer Windows Formularanwendung (WinForm) äußerst vorsichtig sein oder ein Deadlock auftreten. Wenn Sie diese Methode in einem WinForm Control-Ereignis aufrufen (z. B. auf eine Schaltfläche klicken), und verwenden Sie die synchrone Invoke Methode, um das Steuerelement zu leiten, um einige UI-Aufgaben (z. B. das Ändern von Farben) in der Mitte der Verarbeitung der Transaktion auszuführen, tritt ein Deadlock auf. Dies liegt daran, dass die Invoke Methode synchron ist und den Workerthread blockiert, bis der UI-Thread seinen Auftrag beendet. In unserem Szenario wartet der UI-Thread jedoch auch auf den Workerthread, um die Transaktion zu übernehmen. Das Ergebnis ist, dass keine fortfahren kann und der Bereich auf unbestimmte Zeit wartet, bis der Commit abgeschlossen ist. Sie sollten anstelle von überall nach Möglichkeit verwenden BeginInvoke Invoke , da es asynchron ist und damit weniger anfällig für den Deadlock ist.

Gilt für