2010-04-23 102 views
12

我想添加一个开始...救援块到我的一个控制器创建方法,以便记录更好的信息并构造正确的错误消息以返回到客户端。以任何方式挽救'中断'回滚过程?如果我使用begin ... rescue,rails是否会回滚?

我假设rails会自动回滚。它何时发生?当我进入救援条款时,它已经发生了吗?

我在Dreamhost上使用mySQL,我认为他们使用innoDB。

+0

请参加这个答案一看:http://stackoverflow.com/questions/14329877/render-failing-to-render-correct-template-in-rescue-from- activerecordrollback/35731832#35731832 – monteirobrena 2016-03-01 19:36:18

回答

0

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

ModelName.transaction do 
end 

这是在保存的调用中明确完成的,以便您的所有回调一起执行。你在抢救区遇到什么异常?你在回应什么?什么样的错误?

+0

我正在陷入僵局。我认为我没有足够的空间来描述它。这是一个纸牌游戏。但是在我的PlayerAction模型的after_save回调方法中,我创建了另一个PlayerAction实例。我在他们的相关模型上遇到了僵局。当发生这种情况时,我想回滚整个事情,包括第一个PlayerAction模型及其创建的关系。 听起来像你说的轨道不会自动交易,是吗?我必须明确地启动它们并引发回滚?有没有资源在这个地方?我一直在寻找... – user26270 2010-04-23 18:42:31

+0

它确实对显式事务进行处理,但只能通过save和update_attributes等方法进行。所以你的after_save会在同一个事务中运行。 – jonnii 2010-04-23 20:12:53

+0

我不确定关于死锁的建议,有时您可以重新排序以避免它们。有几个插件用于重试死锁(http://github.com/rails/deadlock_retry)。也许值得一看。 – jonnii 2010-04-23 20:13:59

14

我一直在试验这个。看起来如果你的救援获得了可能导致回滚的异常,那么已经发生的事务的一部分被提交。就我而言,我希望数据库回滚到事务开始之前的状态,但我仍然想处理异常。

我结束了与此:

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 

raise ActiveRecord::Rollback部分可以确保交易得到完全回滚。没有它,从first_operation的变化将最终承诺。

ActiveRecord :: Rollback是一种特殊的异常,不会在事务级别之上冒泡,因此您不会以渲染错误页面的未捕获异常结束。

我不确定这是做到这一点的黄金标准方式,但它似乎工作。

+0

请注意,如果您在事务处理块内部捕捉到异常,并且您希望在发送电子邮件时执行某些操作,则会因为事务阻止而导致失败。 – 2014-11-28 16:36:54

-2

你也可以试试我的回滚,抓答案和渲染使用ActiveRecord的Base.transaction你创建方法::: - Click Here

感谢

-1

回滚不会被处理。

例如:

create_table "helps", :force => true do |t| 
    t.string "title",       :null => false 
    t.text  "content" 
end 

#Rails console 
Help.transaction do 
    Help.create! title: "aaa" 
    begin 
    Help.create! content: "111" 
    rescue 
    p "create error." 
    end 
    Help.create! title: "bbb" 
end 

#get this 
>> "create error." 
Help.count 
>> 2 
相关问题