Как определить транзакцию преподаваться в обслуживаемом компании?

StackOverflow https://stackoverflow.com/questions/4413907

Вопрос

Я пытаюсь создать System.enterpriseServices.servicedComponent, чтобы участвовать в распределенной сделке. Мой главный метод выглядит что-то подобное:

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

То, что я пытаюсь сделать, это обнаружить, была ли распределенная транзакция была прервана (или откатывается назад), а затем приступить к откату моих изменений. Например, я мог бы создать файл на диске или сделать некоторые побочные эффекты, которые должны быть отменены.

Я пытался справиться с системойТранзажением.Транзадействительным событием или проверил состояние системного удовлетворения в методе Dispose () без успеха.

Я понимаю, что это похоже на «компенсацию», а не «транзакцию».

Делает то, что я пытаюсь сделать даже иметь смысл?

Это было полезно?

Решение 2

Отвечая на мой собственный вопрос, это возможно, вынимая обслуживаниекомпонент от System.transactions.ienlistmentnotification также.

Другие советы

Я бы порекомендовал не управлять транзакцией таким образом, если вам это не нужно.

Если вы хотите, чтобы ваша операция, чтобы проголосовать прервать, если какая-либо из других операций, участвующих в цепочке, или проголосовать за совершение, если все прошло нормально; Просто поместите АН [AutoComplete] atttribute (см Замечания раздел на этом статья) чуть выше декларации вашего метода.

Таким образом, текущая транзакция будет прервана на случай, если исключение повышает и будет завершен иначе, автоматически.

Рассмотрим код ниже (это может быть типичным классом обслуживанного компонента):

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;
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top