CommittableTransaction.Commit Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Próbuje zatwierdzić transakcję.
public:
void Commit();
public void Commit();
member this.Commit : unit -> unit
Public Sub Commit ()
Wyjątki
Commit() jest wywoływana, a transakcja zostaje wycofana po raz pierwszy.
Uwagi
Po wywołaniu tej metody wszystkie obiekty zarejestrowane do udziału 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 wystąpienie 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 wszyscy menedżerowie zasobów i rejestracje w transakcji głosowali nad wynikiem transakcji i TransactionManager trwale postanowił 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 inne transakcje do wyświetlania tych danych.
Ponieważ ta metoda blokuje się do momentu ukończenia pierwszej fazy przetwarzania transakcji, należy zachować szczególną ostrożność podczas używania tej metody w aplikacji Windows Form (WinForm) lub może wystąpić zakleszczenie. 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 trakcie przetwarzania transakcji, nastąpi zakleszczenie. Dzieje się tak, ponieważ Invoke metoda jest synchroniczna i blokuje wątek procesu roboczego do momentu zakończenia zadania przez wątek interfejsu użytkownika. Jednak w naszym scenariuszu wątek interfejsu użytkownika oczekuje również 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żyć BeginInvoke , a nie Invoke wszędzie tam, gdzie to możliwe, ponieważ jest asynchroniczne, a tym samym mniej podatne na zakleszczenie.