Rails 事务

Rails 中的事务

Rails 的事务使用方法有两种:

第一种使用方法:直接使用 ActiveRecord::Base 中的事务,如:

ActiveRecord::Base.transaction do
  或许会产生异常的处理
end
  不产生异常时的处理
rescue => e
  产生异常时的处理

第二种,使用模型的事务。由于模型继承了 ActiveRecord::Base,所以模型也包含了事务:

模型.transaction do
  或许会产生异常的处理
end
  不产生异常时的处理
rescue => e
  产生异常时的处理

Rails 中多表事务

Rails 在使用事务时经常会涉及多张表。比如一个 Release 的实例会关联多个 WorkOrder 实例,那么在事务中先存储 Release,然后存储 WorkOrder 时触发异常(比如 redmine_id 的唯一性约束):

Release.transaction do
  release = Release.create
  release.work_orders.create!(redmine_id:1)
  release.work_orders.create!(redmine_id:1)
end

经实验,ReleaseWorkOrder 都会回滚。