我想添加一个开始...救援块到我的一个控制器创建方法,以便记录更好的信息并构造正确的错误消息以返回到客户端。以任何方式挽救'中断'回滚过程?如果我使用begin ... rescue,rails是否会回滚?
我假设rails会自动回滚。它何时发生?当我进入救援条款时,它已经发生了吗?
我在Dreamhost上使用mySQL,我认为他们使用innoDB。
我想添加一个开始...救援块到我的一个控制器创建方法,以便记录更好的信息并构造正确的错误消息以返回到客户端。以任何方式挽救'中断'回滚过程?如果我使用begin ... rescue,rails是否会回滚?
我假设rails会自动回滚。它何时发生?当我进入救援条款时,它已经发生了吗?
我在Dreamhost上使用mySQL,我认为他们使用innoDB。
仅仅使用begin
... rescue
是不足以回滚事务。您需要使用:
ModelName.transaction do
end
这是在保存的调用中明确完成的,以便您的所有回调一起执行。你在抢救区遇到什么异常?你在回应什么?什么样的错误?
我正在陷入僵局。我认为我没有足够的空间来描述它。这是一个纸牌游戏。但是在我的PlayerAction模型的after_save回调方法中,我创建了另一个PlayerAction实例。我在他们的相关模型上遇到了僵局。当发生这种情况时,我想回滚整个事情,包括第一个PlayerAction模型及其创建的关系。 听起来像你说的轨道不会自动交易,是吗?我必须明确地启动它们并引发回滚?有没有资源在这个地方?我一直在寻找... – user26270 2010-04-23 18:42:31
它确实对显式事务进行处理,但只能通过save和update_attributes等方法进行。所以你的after_save会在同一个事务中运行。 – jonnii 2010-04-23 20:12:53
我不确定关于死锁的建议,有时您可以重新排序以避免它们。有几个插件用于重试死锁(http://github.com/rails/deadlock_retry)。也许值得一看。 – jonnii 2010-04-23 20:13:59
我一直在试验这个。看起来如果你的救援获得了可能导致回滚的异常,那么已经发生的事务的一部分被提交。就我而言,我希望数据库回滚到事务开始之前的状态,但我仍然想处理异常。
我结束了与此:
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是一种特殊的异常,不会在事务级别之上冒泡,因此您不会以渲染错误页面的未捕获异常结束。
我不确定这是做到这一点的黄金标准方式,但它似乎工作。
请注意,如果您在事务处理块内部捕捉到异常,并且您希望在发送电子邮件时执行某些操作,则会因为事务阻止而导致失败。 – 2014-11-28 16:36:54
你也可以试试我的回滚,抓答案和渲染使用ActiveRecord的Base.transaction你创建方法::: - Click Here
感谢
回滚不会被处理。
例如:
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
请参加这个答案一看:http://stackoverflow.com/questions/14329877/render-failing-to-render-correct-template-in-rescue-from- activerecordrollback/35731832#35731832 – monteirobrena 2016-03-01 19:36:18