CommittableTransaction.Commit Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Försöker checka in transaktionen.
public:
void Commit();
public void Commit();
member this.Commit : unit -> unit
Public Sub Commit ()
Undantag
Commit() anropas och transaktionen återställs för första gången.
Kommentarer
När den här metoden anropas avsöks alla objekt som har registrerat sig för att delta i transaktionen och kan oberoende ange sin röst för att antingen checka in eller återställa transaktionen. Om någon deltagare röstar för att återställa transaktionen återställs den och den här metoden genererar ett TransactionException undantag. Detta är en normal förekomst för en transaktion och koden bör fånga och bearbeta sådana undantag.
Commit och EndCommit blockera tills den första fasen av transaktionsbearbetningen har slutförts. Den första fasen avslutas efter att alla resurshanterare och registreringar i transaktionen har röstat om transaktionsresultatet TransactionManager och har bestämt sig för att checka in eller avbryta transaktionen. Den andra fasen av bearbetningen är alltid asynkron. Därför finns det ingen garanti för att data som just har checkats in från en viss transaktion blir omedelbart tillgängliga efteråt när du inte använder en annan transaktion för att visa dessa data.
Eftersom den här metoden blockeras tills den första fasen av transaktionsbearbetningen är klar bör du vara mycket försiktig när du använder den här metoden i ett winform-program (Windows Form) eller ett dödläge kan inträffa. Om du anropar den här metoden i en WinForm Control-händelse (till exempel genom att klicka på en knapp) och använder den synkrona Invoke metoden för att dirigera kontrollen för att utföra vissa UI-uppgifter (till exempel ändra färger) mitt under bearbetningen av transaktionen, uppstår ett dödläge. Det beror på att Invoke metoden är synkron och blockerar arbetstråden tills användargränssnittstråden har slutfört sitt jobb. Men i vårt scenario väntar användargränssnittstråden också på att arbetstråden ska checka in transaktionen. Resultatet är att ingen kan fortsätta och omfånget väntar på obestämd tid för att incheckningen ska slutföras. Du bör använda BeginInvoke i stället Invoke för när det är möjligt, eftersom det är asynkront och därmed mindre utsatt för dödläge.