CommittableTransaction.Commit Methode

Definition

Versucht, die Transaktion zu übernehmen.

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 InDoubt.

Commit() wird aufgerufen, und die Transaktion wird zum ersten Mal zurückgesetzt.

Hinweise

Wenn diese Methode aufgerufen wird, werden alle Objekte, die sich für die Teilnahme an der Transaktion registriert haben, abgefragt und können unabhängig von deren Abstimmung angeben, um die Transaktion zu übernehmen oder zurückzunehmen. Wenn ein Teilnehmer ein Rollback der Transaktion abgibt, 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 abfangen und verarbeiten.

Commit und EndCommit blockieren, bis die erste Phase der Transaktionsverarbeitung abgeschlossen ist. Die erste Phase endet, nachdem alle Ressourcenmanager und Listen in der Transaktion über das Transaktionsergebnis abgestimmt haben und die TransactionManager entscheidungslos beschlossen hat, die Transaktion zu übernehmen oder abzubrechen. Die zweite Phase der Verarbeitung ist immer asynchron. Daher besteht keine Garantie dafür, dass Daten, die nur innerhalb einer bestimmten Transaktion zugesichert wurden, sofort verfügbar sind, wenn sie keine andere Transaktion zum Anzeigen dieser Daten verwenden.

Da diese Methode blockiert wird, bis die erste Phase der Transaktionsverarbeitung abgeschlossen ist, sollten Sie bei der Verwendung dieser Methode in einer Windows Form -Anwendung (WinForm) äußerst vorsichtig sein, oder ein Deadlock kann auftreten. Wenn Sie diese Methode innerhalb eines WinForm-Steuerelementereignisses aufrufen (z. B. durch Klicken auf eine Schaltfläche), und verwenden Sie die synchrone Invoke Methode, um das Steuerelement anzuweisen, 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 hat. 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 statt BeginInvoke wo immer möglich verwendenInvoke, da sie asynchron und damit weniger anfällig für Deadlocks ist.

Gilt für: