2008-09-23 91 views
6

整个宁静的动词是在一个单一的包容性交易?也就是说,如果我在处理UPDATE,DELETE或CREATE操作的任何时候在验证或回调中引发错误,那么在之前的回调中可能执行的每个数据库操作也会回滚?简单地说,在任何回调或验证中引发一个错误会导致数据库中该动词操作完全没有发生任何变化?什么时候交易开始时使用(宁静)轨道

回答

3

整个宁静的动词是在一个单一的包容性交易下吗?

没有

,如果我在一个更新的处理任何一点提高在验证或回调一个错误,删除或创建操作,就是我可以在以前已执行的每一个数据库操作回调也回滚了?

做任何回调或验证使抚养错误它使得在没有变化的数据库中该动词的动作发生?

如果你希望这个行为,你可以明确地建立在你的控制器交易(查看其他用户提供的例子),或使用around_filter的行为附加到你所有的宁静行动。

1

一些方法(创建,销毁)立即转到数据库。交易通过使用ActiveRecord的派生类的交易方法如下发生:(这个例子是多个数据库对于一个单一的数据库,你只需要一个事务。)

Student.transaction do 
    Course.transaction do 
    course.enroll(student) 
    student.units += course.units 
    end 
end 

然后,您可以回滚在这些事务上,事务内抛出的异常在回滚之后传播。

这取决于具有交易的数据库。

注意:保存和销毁包装在交易中。

+0

您不需要像这样嵌套事务。任何对.transaction的调用都会传递给ActiveRecord :: Base。你直接调用两次ActiveRecord :: Base.transaction – 2008-09-23 23:35:34

4

默认情况下,在事务内没有写入数据库代码,您需要告诉它在代码中执行该操作。

def create 
    Model.transaction do 
    Model.create!(params[:model]) 
    Model.association.create!(params[:association]) 
    end 
    rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid 
    flash[:notice] = "That record could not be saved." 
    render :action => "new" 
end 

使用#create!方法将尝试保存记录,如果它们失败,它们将引发异常,然后回滚已在事务块内执行的任何代码。

如果您不拯救该行为,您将被重定向到(我认为)您公共目录中的405.html(如果存在)。

相关问题