Я уже посмотрел здесь и нашел несколько полезных советов по управлению транзакциями.
Моя проблема в том, что я также вызываю веб-сервис по крайней мере в одном случае, регистрируясь в таблице базы данных. Вот некоторый псевдо-код, который может помочь прояснить ситуацию:
customer = batchRefundToProcess.RefundCustomer;
//Validate everything
if (ValidateRefund(batchRefundToProcess) == false)
{
refund.RefundStatusId = (int)REFUNDSTATUSES.RefundDenied;
refund.ReviewedBy = displayUserName;
refund.Update();
return false;
}
//get this customer's payments
List<RefundTran> trans = customer.ARTransactions;
refund.RefundStatusId = (int)REFUNDSTATUSES.RefundInProcess;
refund.ReviewDate = DateTime.Now;
refund.ReviewedBy = displayUserName;
refund.Update();
List<RefundTran> paperTransactions = new List<RefundTran>();
foreach (RefundTran transaction in trans)
{
if (customer.Balance < 0) //balance is negative if we owe them money
{
//processtransaction has the following side effects:
//1. refund detail is created for the tran
//2. customer is billed for the refunded amount, web service is called
var paperTransaction = processTransaction(customer, transaction, refund);
if (paperTransaction != null) //this transaction qualifies for a paper check for one reason or another
{
paperTransactions.Add(paperTransaction);
}
}
}
//get total amount
//basically, the sum total of all their paper check transactions plus whatever's left on their balance, if anything
decimal paperCheckAmount = paperTransactions.Sum(pt => pt.Amount) - customer.Balance;
if (paperTransactions.Count > 0)
{
//cut a check for all the transactions together
AddLineToFile(customer, paperCheckAmount, paperTransactions.First(), REFUNDFILETYPE.ElectronicCheck, refund.RefundId);
}
refund.RefundStatusId = (int)REFUNDSTATUSES.RefundApproved;
refund.ReviewedBy = displayUserName;
refund.Update();
} //end using block
return true;
Там есть звонки через веб-сервис и ведение журнала базы данных. Я знаю, что нет никакого волшебного способа «отменить» вызов веб-службы для стороннего поставщика, но как мне предотвратить откат журналирования базы данных вместе с транзакцией в случае сбоя? Что мне делать в том случае, если я уже позвонил в веб-сервис? Я делаю это слишком сложно? Я не хочу выставлять счет клиенту, а затем не в состоянии срезать ему чек или, что еще хуже (по мнению моей организации), срезать ему чек, но при этом не удается выставить счет!