【问题标题】:How to achieve distributed transactions in of Active RecordActive Record中如何实现分布式事务
【发布时间】:2013-09-19 07:09:15
【问题描述】:

我的控制器操作之一是

def create
 App.transaction do
  app = App.create_new_app(params["app_alias"])
  campaign = Campaign.create_new_campaign(params)
  user = User.create_new_user(params)
 end
end

This documentation 说“事务作用于单个数据库连接”和“完全分布式事务超出了 Active Record 的范围。”如果在创建用户或活动时出现异常,我该如何创建类似的东西应用也回滚,反之亦然?

【问题讨论】:

    标签: ruby-on-rails ruby transactions


    【解决方案1】:

    根据the same documentation you link to,您可以通过嵌套不同类的事务来创建分布式事务的效果:

    Student.transaction do
      Course.transaction do
        course.enroll(student)
        student.units += course.units
      end
    end
    

    这被描述为一种不优雅的解决方法,但这里建议的其他任何东西很可能也是如此。

    当然,如果您的每个类都存储到不同的数据库中,您只需要执行此操作 - 如果您的所有模型都在同一个数据库中,则单个 .transaction 块将产生预期的效果 - 任何过程中的任何故障部分将回滚所有更改。

    【讨论】:

    • 我承认我没有尝试过,但它确实看起来应该可以工作。也许您可以在问题中添加您尝试使用的代码、获得的结果以及您想要/期望它做什么?
    • 我已经编写了我正在使用的相同代码。每个模型方法都在调用一些方法来执行一些数据库操作。
    • 我不知道“我正在使用相同的代码”是什么意思,但嵌套事务是解决此问题的建议方法。除非您能证明它们不起作用以及如何起作用,否则我看不到您打算在这里完成什么。祝你好运,无论如何。
    • 感谢您的帮助 .. 它现在可以工作了。我在这里错过的唯一一件事是正确嵌套您要最后执行的数据库操作应该在事务中的第一个等等.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多