Использование транзакции в сервисе приложений - PullRequest
1 голос
/ 04 июня 2011

В моем текущем приложении в платежном шлюзе я хочу выполнить эти шаги

  1. Перевод средств из PayPal.
  2. Сохранить запись о платеже в базе данных
  3. Увеличьте фонд пользователя (который находится в нашей базе данных) на сумму, которую он перевел.

Я выполняю все эти шаги на уровне приложения. Внутри транзакции

Ниже приведен код

 public void DepositFundInAdvertiser(PaymentInfo paymentInfo, RegistrationID advertiserRegistrationID)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                PaymentResult paymentResult = paymentService.DepositFund(paymentInfo);

                Advertiser advertiser = advertiserRepository.Find(advertiserRegistrationID);
                TransactionNumber transactionNumber = paymentRepository.NextTransactionNumber();
                Payment payment = PaymentFactory.NewPayment(advertiser.Person, transactionNumber, paymentInfo, paymentResult);

                paymentRepository.Save(payment);

                AdvertiserBalance newBalance = new AdvertiserBalance(advertiser.Balance.Amount + paymentInfo.PaymentTotal);//Increasing advertiser fund

                advertiser.AddFund(newBalance);

                advertiserRepository.Save(advertiser);

                scope.Complete();


            }

        }

Проблема: у меня вопрос: могу ли я использовать транзакцию в слое приложения, как этот, потому что вся эта операция должна быть атомарной?

1 Ответ

2 голосов
/ 06 июня 2011

Я бы сказал, что это хороший компромисс между сложностью и надежностью. Вам нужно только помнить, что, выполняя это, вы соединяете оба хранилища. Вы не сможете изменить ни один из них, не принимая во внимание влияние этого изменения на другое и на инфраструктуру транзакций. Пока оба репозитория используют один и тот же экземпляр базы данных или RDBMS, которая полностью поддерживает распределенные транзакции, все в порядке. Вроде.

Как вы, наверное, знаете, чистое решение - это асинхронный обмен сообщениями, но он представляет большую сложность. Дело в том, что сложность, связанная с асинхронным обменом сообщениями, имеет тенденцию быть плоской - она ​​не возрастает, когда вы добавляете больше репозиториев, больше хранилищ данных и т. Д. В конечном итоге это окупается. Если у вас есть один такой вариант использования, я бы воспользовался предложенным вами решением. Как я уже сказал, это хороший компромисс, а создание программного обеспечения - это хорошие компромиссы.

...