如何在Active Record中实现分布式事务

时间:2013-09-19 07:09:16

标签: ruby-on-rails ruby transactions

我的一个控制器动作就像

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的范围。”如何在创建用户或创建用户时创建一些异常广告系列然后应用程序也回滚,反之亦然?

1 个答案:

答案 0 :(得分:3)

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

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

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

当然,如果每个类都存储在不同的数据库中,则只需执行此操作 - 如果所有模型都在同一个数据库中,则单个.transaction块将具有所需的效果 - 任何失败在任何部分都将回滚所有更改。