CommittableTransaction.Commit Methode

Definitie

Probeert de transactie door te voeren.

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

Uitzonderingen

Commit() wordt aangeroepen op een transactie en de transactie wordt InDoubt.

Commit() wordt aangeroepen en de transactie wordt voor het eerst teruggedraaid.

Opmerkingen

Wanneer deze methode wordt aangeroepen, worden alle objecten die zijn geregistreerd om deel te nemen aan de transactie gepeild en kunnen ze onafhankelijk aangeven dat ze de transactie doorvoeren of terugdraaien. Als deelnemers stemmen om de transactie terug te draaien, wordt deze teruggedraaid en wordt deze methode een TransactionException uitzondering gegenereerd. Dit is een normale gebeurtenis voor een transactie en uw code moet dergelijke uitzonderingen ondervangen en verwerken.

Commit en EndCommit blokkeren totdat de eerste fase van transactieverwerking is voltooid. De eerste fase eindigt nadat alle resourcemanagers en inlistingen in de transactie hebben gestemd over het transactieresultaat en het TransactionManager heeft definitief besloten om de transactie vast te leggen of af te breken. De tweede fase van de verwerking is altijd asynchroon. Daarom is er geen garantie dat gegevens die alleen vanuit een bepaalde transactie zijn vastgelegd, onmiddellijk daarna beschikbaar zijn wanneer ze geen andere transactie gebruiken om deze gegevens weer te geven.

Omdat deze methode wordt geblokkeerd totdat de eerste fase van transactieverwerking is voltooid, moet u uiterst voorzichtig zijn bij het gebruik van deze methode in een Windows Formulier-toepassing (WinForm) of kan er een impasse optreden. Als u deze methode aanroept binnen één WinForm-besturingselementgebeurtenis (bijvoorbeeld op een knop klikken) en de synchrone Invoke methode gebruikt om het besturingselement te leiden om bepaalde UI-taken uit te voeren (bijvoorbeeld kleuren wijzigen) in het midden van de verwerking van de transactie, gebeurt er een impasse. Dit komt doordat de Invoke methode synchroon is en de werkrolthread blokkeert totdat de ui-thread de taak heeft voltooid. In ons scenario wacht de UI-thread echter ook totdat de werkrolthread de transactie doorvoert. Het resultaat is dat er geen kan worden voortgezet en dat het bereik voor onbepaalde tijd wacht totdat de doorvoer is voltooid. U moet BeginInvoke gebruiken in plaats Invoke van waar mogelijk, omdat het asynchroon is en dus minder gevoelig is voor impasses.

Van toepassing op