Rails 3:将 ActiveRecord 操作和外部信用卡包装在单个事务中

Posted

技术标签:

【中文标题】Rails 3:将 ActiveRecord 操作和外部信用卡包装在单个事务中【英文标题】:Rails 3: wrapping ActiveRecord operations and external credit card in a single transaction 【发布时间】:2012-07-11 15:48:49 【问题描述】:

我正在使用 ActiveMerchant 处理可能成功或失败的信用卡交易,这是涉及使用 ActiveRecord 处理的一些内部会计的更大交易的一部分。如果部分失败,我不清楚如何回滚整个事务。

我有一个支付模型和一个积分模型 - 用户的积分将转换为美元以用于减少他们的付款。所以我需要做这些事情:

与金额和积分相关的多项验证 保存积分交易:借记用户帐户,贷记内部帐户 从信用卡中扣除从积分中扣除的金额 保存此付款数据 保存信用卡交易结果(无论成功与否) 如果一切正常,请向用户发送电子邮件

我了解ActiveRecord::Transactions 的工作原理,并假设我可以使用after_commit(和after_rollback)回调来处理诸如向用户发送电子邮件之类的事情。

但是,如何让失败的信用卡交易导致与失败的 AR save 相同的回滚?如果我的非 AR 交易失败,是否像调用 raise ActiveRecord::Rollback 一样简单?上面链接的文档中有一个部分让我对此感到紧张(与无法跨多个数据库连接工作的事务有关)。

Rails 3.2.5、mysql 5.1 (InnoDB)、Ruby 1.9.3

【问题讨论】:

您的 ActiveMerchant 调用是针对外部服务器的,因此它不会影响您的 ActiveRecord 交易。随时提出ActiveRecord::Rollback @TanzeebKhalili -- 将此移至答案,我会将其标记为已回答 -- 一切都已完成并且可以正常工作。 【参考方案1】:

您的 ActiveMerchant 调用是针对外部服务器的,因此它不会影响您的 ActiveRecord 交易。欢迎提出ActiveRecord::Rollback

【讨论】:

以上是关于Rails 3:将 ActiveRecord 操作和外部信用卡包装在单个事务中的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 包括翻译 globalize3 activerecord

禁用 Rails 4 的 ActiveRecord

ActiveRecord / Rails 3 中的日期格式

Rails 3包含翻译globalize3 activerecord

Rails/Arel:选择所有记录作为 ActiveRecord::Relation

ActiveRecord Rails 3 范围与类方法