2

我们在 out_logs 控制器中有以下代码,用于保存到 rails 3.1.3 应用程序的两个表中。为了确保这两个节省是在完成或没有完成的情况下完成的,使用了一个事务。

  @out_log.transaction do
    if @out_log.save && @part.save
      redirect_to part_path(@part), :notice => "Saved!"
    else
      flash.now[:error] = "Not saved!"
      render 'new'
    end   
  end  

该代码似乎有效。我们的问题是:

  1. 上面的代码是交易的好习惯吗?
  2. 事务循环中有redirect_to和render,这些redirect_to或render是否会增加事务循环的执行时间,从而导致数据库(我们使用sqlite3)锁定时间过长?

非常感谢。

4

1 回答 1

3

首先:redirect_to或者render不要表现得像一个return声明。他们只是在当前正在准备的响应中分配一些标头。

关于交易:

if @out_log.save && @part.save

上面的代码肯定会导致数据库中的状态不一致:如果第一个save成功而第二个不成功怎么办?甚至很难想象。

解决方案很简单:使用save!(末尾有感叹号)。这样,如果您的验证失败,您的整个事务将被回滚(将引发异常,而不是按原样save!返回)。falsesave

于 2012-04-22T13:02:33.817 回答