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"