У меня есть сервисы, вызванные методом Guardian, для которого TransactionScope открыт для каждого запроса, и завершите эту транзакцию, если все в порядке:
void ExecuteWorker(...)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
...CallLogicMethods...
scope.Complete();
}
}
Один из методов взаимодействует со службой «Внешний», и в случае сбоя этого взаимодействия все мои транзакции также не выполняются. В результате я не сохраняю необходимые данные (рассчитанные до запроса во внешнюю службу.
void DoLogic1(...)
{
CalculateSomeData(...);
SaveCalculatedData(...);
DoRequestToExternalService(...);
}
Как лучше всего решить эту проблему?
Приложение написано с использованием C #, .NET 4.0, MS SQL 2008.
Сам вижу два решения
Использование try / catch:
void DoLogic11 (...)
{
CalculateSomeData (...);
SaveCalculatedData (...);
try
{
DoRequestToExternalService(...);
}
catch(Exception exc)
{
LogError(...);
}
}
Недостаток этого подхода в том, что я скрываю исключение от вызывающей стороны. Но я хотел бы передать ошибку наружу как исключение (для регистрации и т. Д.).
- Использование 'Nested transcation', но я не уверен, как это работает.
Вот мое видение, оно должно быть:
void DoLogic12(...)
{
using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
{
CalculateSomeData(...);
SaveCalculatedData(...);
scopeNested.Complete()
}
DoRequestToExternalService(...);
}
Я реализовал это, пытался использовать, но кажется, что вложенный транскрипция фиксируется только в том случае, если внешний также фиксируется.
Пожалуйста, сообщите.