Rails事务没有回滚

时间:2014-01-24 19:17:33

标签: activerecord transactions ruby-on-rails-4

如果一个人创建,为什么这个事务不会回滚!失败? 如果这有任何区别,它在控制器中。

def process_photos(photos)
  ActiveRecord::Base.transaction do
    begin
      photos.each do |photo|
        Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
      end
    rescue
      raise ActiveRecord::Rollback
    end
  end
end

我明确发送一个包含一些不良记录的数组。好的是正在创建而坏的不是,但即使一个失败,我也需要全部回滚。

这是我的rspec测试(传递json数组照片)并且它正在递增。

expect { post :create, json }.not_to change(Photo, :count)

3 个答案:

答案 0 :(得分:16)

这只是rspec的测试问题,因为您已经在测试中的事务中执行了。这是与here讨论的相同的嵌套事务问题。 为了使测试起作用,您需要添加...

requires_new: true

到交易电话。

这修复了测试。

def process_photos(photos)
  ActiveRecord::Base.transaction(requires_new: true) do
    begin
      photos.each do |photo|
        Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
      end
    rescue
      raise ActiveRecord::Rollback
    end
  end
end

重要提示:只有数据库引擎支持回滚时,回滚才有效!例如,带有MyISAM的MySQL不支持事务,而带有Inno DB的MySQL确实支持它们。

答案 1 :(得分:0)

您需要像这样在代码块外开始

def process_photos(photos)
 begin
      ActiveRecord::Base.transaction do
          photos.each do |photo|
            Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
          end
        rescue
          raise ActiveRecord::Rollback
        end
      end
    end

答案 2 :(得分:0)

这也很好,不需要传播ActiveRecord :: Rollback异常。

def process_photos(photos)
  begin
    ActiveRecord::Base.transaction do
      photos.each do |photo|
        Photo.create!(creator_user: @user, buyer: @buyer, url: photo['url'])
      end
    end
  rescue ActiveRecord::RecordInvalid
    puts 'Transaction failed'
  end
end