Frage

Ich versuche, eine System.EnterpriseServices.ServicedComponent zu schaffen, um in einer verteilten Transaktion teilnehmen. Meine wichtigste Methode sieht etwa so aus:

public void DoSomething()
{
    try
    {
      // do something useful

      // vote for commit

      if (ContextUtil.IsInTransaction)
          ContextUtil.MyTransactionVote = TransactionVote.Commit;
    }

    catch
    {
      // or shoud I use ContextUtil.SetAbort() instead?

      if (ContextUtil.IsInTransaction)
          ContextUtil.MyTransactionVote = TransactionVote.Abort;

      throw;
    }
}

Was ich versuche zu tun ist, Erfassen, ob die verteilte Transaktion abgebrochen wurde (oder zurückgesetzt) ??und dann geht meine Änderungen auch rückgängig zu machen. Zum Beispiel könnte ich eine Datei auf der Festplatte erstellt, oder einige Nebenwirkungen getan, dass Bedarf rückgängig gemacht werden.

Ich habe versucht, das SystemTransaction.TransactionCompleted Ereignis oder kontrolliert den Zustand der SystemTransaction in der Methode Dispose () ohne Erfolg zu behandeln.

Ich verstehe, dass dies ähnlich wie bei „Kompensation“ und nicht als „Transaktion“.

das tut, was ich versuche zu tun, auch Sinn machen?

War es hilfreich?

Lösung 2

meine eigene Frage zu beantworten, ist dies möglich, indem die ServicedComponent von System.Transactions.IEnlistmentNotification auch.

Andere Tipps

Ich würde empfehlen, die Transaktion nicht in einer solchen Art und Weise zu verwalten, wenn Sie es brauchen.

Wenn Sie Ihren Betrieb Abstimmung abbrechen, wenn eine der anderen in der Kette beteiligten Operationen fehlschlagen, oder Stimme für begehen, wenn alles gut geht; gerade einen [AutoComplete] atttribute platzieren (siehe Bemerkungen auf diese Artikel ) nur oben Erklärung Ihre Methode ist.

Auf diese Weise wird die aktuelle Transaktion eine Ausnahme auslöst nur für den Fall abgebrochen werden und wird ansonsten abgeschlossen werden, automatisch.

Betrachten Sie den Code (dies könnte eine typische serviced Komponentenklasse sein):

using System.EnterpriseServices;

// Description of this serviced component
[Description("This is dummy serviced component")]
public MyServicedComponent : ServicedComponent, IMyServiceProvider
{
    [AutoComplete]
    public DoSomething()
    {
        try {
            OtherServicedComponent component = new OtherServicedComponent()
            component.DoSomethingElse();

            // All the other invocations involved in the current transaction
            // went fine... let's servicedcomponet vote for commit automatically
            // due to [AutoComplete] attribute
        }
        catch (Exception e)
        {
            // Log the failure and let the exception go
            throw e;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top