如果我使用begin ... rescue,rails会做回滚吗?

use*_*270 14 transactions exception-handling ruby-on-rails

我想在我的一个控制器创建方法中添加一个begin ... rescue block,以便记录更好的信息并构造正确的错误消息以返回给客户端.救援以任何方式"中断"回滚过程吗?

我假设rails自动进行回滚.它什么时候发生?在我获得救援条款时,它已经发生了吗?

我在Dreamhost上使用mySQL,我认为他们使用的是innoDB.

pse*_*ach 22

我一直在试验这个.看起来如果你的救援捕获了导致回滚的异常,那么已经发生的事务部分就会被提交.在我的情况下,我希望数据库回滚到事务开始之前的方式,但我仍然想要处理异常.

我最终得到了这个:

self.transaction do
  first_operation
  begin
    operation_that_might_violate_db_constraint
  rescue ActiveRecord::RecordNotUnique
      #deal with the error
      raise ActiveRecord::Rollback #force a rollback
  end
end
Run Code Online (Sandbox Code Playgroud)

raise ActiveRecord::Rollback部分确保事务完全回滚.如果没有它,first_operation最终的变化将最终得到承诺.

ActiveRecord :: Rollback是一种特殊的异常,它不会超出事务级别,因此您不会得到一个呈现错误页面的未捕获异常.

我不确定这是做这个的黄金标准方式,但似乎有效.


jon*_*nii 1

仅使用begin...rescue不足以回滚事务。您需要使用:

ModelName.transaction do 
end
Run Code Online (Sandbox Code Playgroud)

这是在调用 save 时显式完成的,以便所有回调一起执行。您在救援区发现了哪些异常情况?你在回应什么?什么样的错误?