7

是否整个宁静动词都在一个包罗万象的事务之下?也就是说,如果我在处理 UPDATE、DELETE 或 CREATE 操作的任何时候在验证或回调中引发错误,我在以前的回调中执行的每个数据库操作是否也会回滚?简而言之,在任何回调或验证上引发错误是否会使该动词操作的数据库中根本没有发生任何变化?

4

3 回答 3

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(如果存在)。

于 2008-09-23T23:08:15.327 回答
4

是否整个宁静动词都在一个包罗万象的事务之下?

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

不。

在任何回调或验证上引发错误是否会使数据库中对该动词操作完全没有更改?

不。

如果您想要这种行为,您可以在控制器中显式创建事务(参见其他用户提供的示例),或者使用 anaround_filter将行为附加到您的所有 restful 操作。

于 2008-09-23T23:37:03.433 回答
1

一些方法(创建、销毁)会立即进入数据库。事务通过在从 ActiveRecord 派生的类上使用事务方法发生,如下所示:

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

(这个例子是针对多个数据库的。对于单个数据库,您只需要一个事务。)

然后,您可以回滚这些事务,事务中引发的异常会在回滚后传播。

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

注意:保存和销毁都包含在事务中。

于 2008-09-23T23:07:25.267 回答