CommittableTransaction.Commit Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Pokusí se potvrdit transakci.
public:
void Commit();
public void Commit ();
member this.Commit : unit -> unit
Public Sub Commit ()
Výjimky
Commit() volá se a transakce se poprvé vrátí zpět.
Poznámky
Při volání této metody se dotazují všechny objekty, které se zaregistrovaly k účasti na transakci, a mohou nezávisle indikovat své hlasy k potvrzení nebo vrácení transakce zpět. Pokud některý účastník hlasuje k vrácení transakce zpět, vrátí se zpět a tato metoda vyvolá TransactionException výjimku. Jedná se o normální výskyt transakce a váš kód by měl tyto výjimky zachytit a zpracovat.
Commit a EndCommit blokovat, dokud nebude dokončena první fáze zpracování transakcí. První fáze končí poté, co všichni správci prostředků a zařazení do transakce hlasovali o výsledku transakce a TransactionManager trvale se rozhodl potvrdit nebo přerušit transakci. Druhá fáze zpracování je vždy asynchronní. Proto není zaručeno, že data, která se právě potvrdí v rámci dané transakce, budou okamžitě k dispozici, pokud k zobrazení těchto dat nepoužíváte jinou transakci.
Vzhledem k tomu, že tato metoda blokuje až do dokončení první fáze zpracování transakcí, měli byste být velmi opatrní při použití této metody v aplikaci Windows Form (WinForm) nebo může dojít k zablokování. Pokud zavoláte tuto metodu uvnitř jedné události ovládacího prvku WinForm (například kliknutím na tlačítko) a pomocí synchronní Invoke metody nasměrujete ovládací prvek k provádění některých úloh uživatelského rozhraní (například změna barev) uprostřed zpracování transakce, dojde k zablokování. Důvodem je to, Invoke že metoda je synchronní a blokuje pracovní vlákno, dokud vlákno uživatelského rozhraní nedokončí svou úlohu. V našem scénáři ale vlákno uživatelského rozhraní čeká také na potvrzení transakce v pracovním vlákně. Výsledkem je, že žádný nemůže pokračovat a obor čeká na dokončení potvrzení neomezeně dlouho. Místo toho, kde je to možné, byste měli použít BeginInvoke Invoke , protože je asynchronní, a proto je méně náchylný k zablokování.