Как определить транзакцию преподаваться в обслуживаемом компании?
-
08-10-2019 - |
Вопрос
Я пытаюсь создать 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;
}
}
}