Udostępnij przez


Przyspieszanie transakcji przez powiadamianie obiektu głównego

Aby efektywnie korzystać z transakcji automatycznych, każdy składnik transakcyjny powinien wskazywać, że zakończył swoją pracę. Gdy wystąpienie obiektu zakończy zadanie pomyślnie, powinno ustawić flagi spójności i zakończenia na True, wywołując metodę IObjectContext::SetComplete. Gdy wszystkie wewnętrzne obiekty transakcji wywołają SetComplete, transakcja może zostać zakończona poprzez jawne dezaktywowanie obiektu głównego poprzez wywołanie jego metody SetComplete. Jawnie wskazując, że obiekt główny zakończył swoją pracę, można zmniejszyć długość transakcji.

Gdy metoda obiektu transakcyjnego zakończy się niepowodzeniem, obiekt powinien ustawić swoją flagę spójności na Fałsz i flagę zakończoną na Prawda, wywołując metodę IObjectContext::SetAbort. Wywołując metodę SetAbort, obiekt zwraca kontrolkę do obiektu wywołującego i zapewnia, że transakcja zostanie ostatecznie przerwana.

Jeżeli obiekt wywołujący SetAbort nie jest korzeniem transakcji, transakcja nadal trwa, mimo że nic nie może jej uratować przed ostatecznym przerwaniem. Aby przyspieszyć zakończenie nieudanej transakcji, możesz zgłosić błąd, aby zasygnalizować obiektowi nadrzędnemu, żeby wywołał SetAbort. Do ukończenia obiekt główny powinien następnie wysłać komunikat o błędzie do klienta.

Chociaż istnieje wiele różnych metod obsługi błędów, podejście powinno wyraźnie koordynować komunikację między obiektami wewnętrznymi i obiektem głównym.

Poniższe fragmenty kodu języka Visual Basic pokazują jedno podejście do obsługi błędów. W pierwszym fragmentze obiekt wewnętrzny wywołuje SetAbort, zgłasza błąd i generuje komunikat o błędzie w następujący sposób:

Dim ObjCtx As ObjectContext
Dim ErrorCode As Long, Description As String

Set ObjCtx = GetObjectContext()
ObjCtx.SetAbort
ErrorCode = vbObjectError + 5
Description = "Some meaningful message"
Err.Raise ErrorCode, , Description

W drugim fragmentcie obiekt główny obsługuje błąd i przekazuje komunikat do klienta w następujący sposób:

Sub MyObjMethod1()
  On Error GoTo MyObjMethod1_err
  Dim ObjCtx As ObjectContext
  Dim InteriorObj1 As Cinterior  ' Cinterior is a user-defined object.

  Set ObjCtx = GetObjectContext()
  Set InteriorObj1 = CreateObject ("MyDll.Cinterior")
  InteriorObj1.Method1
  ' If the call completed successfully, then...
  ObjCtx.SetComplete
Exit Sub
  MyObjMethod1_err:
  ' Doom the transaction and exit.
  ObjCtx.SetAbort
  ' Pass the message back to client.
  Err.Raise Err.Number, , Err.Description
End Sub

zarządzanie transakcjami automatycznymi w modelu COM+