何时使用(restful)rails开始事务

时间:2008-09-23 22:48:10

标签: ruby-on-rails ruby rest transactions

整个restful动词是否属于单一的全包交易?也就是说,如果我在处理UPDATE,DELETE或CREATE操作的任何时候在验证或回调中引发错误,那么我在之前的回调中执行的每个数据库操作是否也会回滚?简而言之,在任何回调或验证中引发错误是否会使数据库中的动词操作完全没有发生变化?

3 个答案:

答案 0 :(得分: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(如果存在)。

答案 1 :(得分:3)

  

整个restful动词是否属于单一的全包交易?

没有

  

如果我在处理UPDATE,DELETE或CREATE操作的任何时候在验证或回调中引发错误,那么我在之前的回调中执行的每个数据库操作是否也会回滚?

没有

  

是否在任何回调或验证时引发错误,使得数据库中的动词操作完全没有发生变化?

没有

如果您需要此行为,您可以在控制器中明确创建事务(请参阅其他用户提供的示例),或使用around_filter将行为附加到您的所有其他操作。

答案 2 :(得分:1)

某些方法(create,destroy)会立即转到数据库。通过对从ActiveRecord派生的类使用事务方法进行事务,如下所示:

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

(此示例适用于多个数据库。对于单个数据库,您只需要一个事务。)

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

这取决于具有事务的数据库。

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