Active Record Transactions 入门
Active Record Transactions 可以应用于 Model 类和 Model 实例,事务块中的对象不必都是同一个类的实例。这是因为事务是按数据库连接,而不是每个模型。例如:
User.transaction do
account.save!
profile.save!
print "All saves success, returning 1"
return 1
end
rescue_from ActiveRecord::RecordInvalid do |exception|
print "Exception thrown, transaction rolledback"
render_error "failure", exception.record.errors.full_messages.to_sentence
end
使用 save with a bang 可确保在抛出异常时自动回滚事务,并且在回滚之后,控制将转到该异常的 rescue 块。确保你拯救了保存中抛出的异常! 在交易阻止中。
如果你不想使用 save!,则可以在保存失败时手动提升 raise ActiveRecord::Rollback
。你无需处理此异常。然后它将回滚事务并将控制权交给事务块之后的下一个语句。
User.transaction do
if account.save && profile.save
print "All saves success, returning 1"
return 1
else
raise ActiveRecord::Rollback
end
end
print "Transaction Rolled Back"