ActiveMerchantを使用して、成功または失敗する可能性のあるクレジットカードトランザクションを処理しています。これは、ActiveRecord処理を使用した内部アカウンティングを含むより大きなトランザクションの一部です。一部に障害が発生した場合にトランザクション全体をロールバックする方法がわかりません。
支払いモデルとポイントモデルがあります。ユーザーのポイントはドルに変換され、支払いを減らすために使用されます。だから私はこれらのことをする必要があります:
- 金額とポイントに関連するいくつかの検証
- ポイントの取引を保存:ユーザーアカウントの借方、内部アカウントの貸方
- ポイントからの価値を差し引いた支払い額をクレジットカードに請求します
- この支払いデータを保存します
- クレジットカードの取引結果を保存します(成功したか失敗したかにかかわらず)
- 次に、すべてが機能する場合は、ユーザーにメールを送信します
ActiveRecord :: Transactionsがどのように機能するかを確認し、 after_commit
(およびafter_rollback
)コールバックを使用してユーザーに電子メールを送信するなどの処理を実行できると想定します。
しかし、失敗したクレジットカード取引が失敗したARsave
が引き起こすのと同じロールバックを引き起こすようにするにはどうすればよいですか?raise ActiveRecord::Rollback
AR以外のトランザクションが失敗した場合に電話をかけるのと同じくらい簡単ですか?上記のリンク先のドキュメントには、これについて神経質になっているセクションがあります(複数のデータベース接続でトランザクションが機能しないことに関連しています)。
Rails 3.2.5、MySQL 5.1(InnoDB)、Ruby 1.9.3