Sdílet prostřednictvím


CommittableTransaction.Commit Metoda

Definice

Pokusí se potvrdit transakci.

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

Výjimky

Commit() je volána transakce a transakce se stane InDoubt.

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

Platí pro