0

我的控制器动作之一就像

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

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

4

1 回答 1

4

根据您链接到的相同文档,您可以通过嵌套不同类的事务来创建分布式事务的效果:

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

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

当然,只有在每个类都存储到不同的数据库时才需要这样做——如果所有模型都在同一个数据库中,单个.transaction块将产生预期的效果——任何部分的任何失败都会回滚所有更改.

于 2013-09-19T07:52:11.470 回答