Question

Je suis en train de créer un System.EnterpriseServices.ServicedComponent afin de participer à une transaction distribuée. Ma principale méthode ressemble à quelque chose comme ceci:

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;
    }
}

Ce que je suis en train de faire est de détecter si la transaction distribuée a été annulée (ou le dos laminé) et puis passez à rollback mes changements. Par exemple, je pourrais avoir créé un fichier sur le disque, ou fait des effets secondaires qui doivent être défaits.

J'ai essayé de gérer l'événement SystemTransaction.TransactionCompleted ou inspecté l'état du SystemTransaction dans la méthode Dispose () sans succès.

Je comprends que cela est semblable à "compensation" plutôt que de "transaction".

Est-ce que je suis en train de faire encore un sens?

Était-ce utile?

La solution 2

répondre à ma propre question, cela est possible en dérivant le ServicedComponent System.Transactions.IEnlistmentNotification ainsi.

Autres conseils

Je recommande de ne pas gérer la transaction de telle manière à moins que vous en avez besoin.

Si vous voulez que votre opération vote abort si l'une des autres opérations impliquées dans la chaîne échouent, ou voter pour engager si tout allait bien; il suffit de placer un atttribute de [AutoComplete] (voir Remarques section à ce article ) juste au-dessus de votre déclaration méthode.

De cette façon, la transaction en cours sera annulée au cas où une relances d'exception et sera terminée autrement, automatiquement.

Considérez le code ci-dessous (cela pourrait être une classe de composant viabilisé typique):

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;
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top