我的一个控制器动作就像
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的范围。”如何在创建用户或创建用户时创建一些异常广告系列然后应用程序也回滚,反之亦然?
答案 0 :(得分:3)
根据the same documentation you link to,您可以通过嵌套不同类的事务来创建分布式事务的效果:
Student.transaction do
Course.transaction do
course.enroll(student)
student.units += course.units
end
end
这被描述为一种不优雅的解决方法,但是这里建议的任何其他内容都可能也是如此。
当然,如果每个类都存储在不同的数据库中,则只需执行此操作 - 如果所有模型都在同一个数据库中,则单个.transaction
块将具有所需的效果 - 任何失败在任何部分都将回滚所有更改。