我想要一个嵌套事务使父事务失败。
假设我有以下模型
class Task < ApplicationRecord
def change_status(status, performed_by)
ActiveRecord::Base.transaction do
update!(status: status)
task_log.create!(status: status, performed_by: performed_by)
end
end
end
我总是想要update
and task_log
创建成为一起执行或根本不执行的事务。
假设我有一个允许我更新多个任务的控制器
class TaskController < ApplicationController
def close_tasks
tasks = Task.where(id: params[:_json])
ActiveRecord::Base.transaction do
tasks.find_each do |t|
t.change_status(:close, current_user)
end
end
end
end
我想要这样,如果有任何一个change_status
失败,整个请求将从父级别事务回滚。
但是,这不是 Rails 中的预期行为,请参阅有关的文档嵌套事务
他们举了两个例子。
User.transaction do
User.create(username: 'Kotori')
User.transaction do
User.create(username: 'Nemu')
raise ActiveRecord::Rollback
end
end
这将创建两个Users
“Kotori”和“Nemu”,因为父母从未看到加薪
然后是下面的例子:
User.transaction do
User.create(username: 'Kotori')
User.transaction(requires_new: true) do
User.create(username: 'Nemu')
raise ActiveRecord::Rollback
end
end
这只创建了“Kotori”,因为只有嵌套事务失败了。
那么我怎样才能让 Rails 了解嵌套事务是否失败,从而导致父事务失败。继续上面的例子,我希望“Kotori”和“Nemu”都不会被创建。