在rails 3.1.3中,事务代码是否良好且最优?

时间:2012-04-22 12:23:18

标签: ruby-on-rails ruby-on-rails-3.1 sqlite

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

  @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)太久了吗?
  3. 非常感谢。

1 个答案:

答案 0 :(得分:3)

首先关闭:redirect_torender不像return声明。他们只是在当前正在准备的响应中分配一些标题。

关于交易:

if @out_log.save && @part.save

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

解决方案非常简单:使用save!(最后带有感叹号)。这样,如果验证失败,您的整个事务将被回滚(save!将引发异常,而不是像false那样返回save