CommittableTransaction.Commit Metoda

Definicja

Próbuje zatwierdzić transakcję.

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

Wyjątki

Commit()jest wywoływana w transakcji, a transakcja staje się .InDoubt

Commit() jest wywoływana, a transakcja jest przywracana po raz pierwszy.

Uwagi

Po wywołaniu tej metody wszystkie obiekty zarejestrowane w celu uczestnictwa w transakcji są sondowane i mogą niezależnie wskazywać ich głos na zatwierdzenie lub wycofanie transakcji. Jeśli którykolwiek uczestnik głosuje, aby wycofać transakcję, zostanie wycofany, a ta metoda zgłasza TransactionException wyjątek. Jest to normalne zdarzenie dla transakcji, a kod powinien przechwytywać i przetwarzać takie wyjątki.

Commit i EndCommit blokuj do momentu ukończenia pierwszej fazy przetwarzania transakcji. Pierwsza faza kończy się po tym, jak wszystkie menedżery zasobów i rejestracje w transakcji głosowały na wynik transakcji i TransactionManager trwale zdecydowała się zatwierdzić lub przerwać transakcję. Druga faza przetwarzania jest zawsze asynchroniczna. W związku z tym nie ma gwarancji, że dane właśnie zatwierdzone z poziomu danej transakcji będą natychmiast dostępne później, gdy nie będą używane innej transakcji do wyświetlania tych danych.

Ponieważ ta metoda blokuje do momentu ukończenia pierwszej fazy przetwarzania transakcji, należy zachować szczególną ostrożność podczas korzystania z tej metody w aplikacji Windows Form (WinForm) lub zakleszczenia. Jeśli wywołasz tę metodę wewnątrz jednego zdarzenia kontrolki WinForm (na przykład kliknięcie przycisku) i użyjesz metody synchronicznej Invoke , aby skierować kontrolkę do wykonywania niektórych zadań interfejsu użytkownika (na przykład zmiany kolorów) w środku przetwarzania transakcji, nastąpi zakleszczenie. Dzieje się tak, ponieważ Invoke metoda jest synchroniczna i blokuje wątek roboczy do momentu zakończenia zadania przez wątek interfejsu użytkownika. Jednak w naszym scenariuszu wątek interfejsu użytkownika również oczekuje na wątek procesu roboczego, aby zatwierdzić transakcję. Wynikiem jest to, że żaden z nich nie może kontynuować, a zakres czeka na zakończenie zatwierdzenia na czas nieokreślony. Należy używać BeginInvoke zamiast Invoke tam, gdzie to możliwe, ponieważ jest asynchroniczne, a tym samym mniej podatne na zakleszczenie.

Dotyczy