Транзакция через операции DAL + вызов веб-службы + регистрация - PullRequest
1 голос
/ 15 сентября 2009

Я уже посмотрел здесь и нашел несколько полезных советов по управлению транзакциями.

Моя проблема в том, что я также вызываю веб-сервис по крайней мере в одном случае, регистрируясь в таблице базы данных. Вот некоторый псевдо-код, который может помочь прояснить ситуацию:

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;

Там есть звонки через веб-сервис и ведение журнала базы данных. Я знаю, что нет никакого волшебного способа «отменить» вызов веб-службы для стороннего поставщика, но как мне предотвратить откат журналирования базы данных вместе с транзакцией в случае сбоя? Что мне делать в том случае, если я уже позвонил в веб-сервис? Я делаю это слишком сложно? Я не хочу выставлять счет клиенту, а затем не в состоянии срезать ему чек или, что еще хуже (по мнению моей организации), срезать ему чек, но при этом не удается выставить счет!

1 Ответ

0 голосов
/ 29 апреля 2011

Я знаю, что это немного поздно, но единственный способ добиться чего-то подобного - использовать что-то вроде NServiceBus.

Взгляните на http://andreasohlund.net/2009/08/24/achieving-consistency-using-nservicebus/ приведен пример аналогичного требования

...