Rails事务没有回滚

kjs*_*js3 11 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
Run Code Online (Sandbox Code Playgroud)

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

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

expect { post :create, json }.not_to change(Photo, :count)
Run Code Online (Sandbox Code Playgroud)

kjs*_*js3 16

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

requires_new: true
Run Code Online (Sandbox Code Playgroud)

到交易电话.

这修复了测试.

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
Run Code Online (Sandbox Code Playgroud)

重要说明:回滚仅在数据库引擎支持时才有效!例如,带有MyISAM的MySQL不支持事务,而带有Inno DB的MySQL确实支持它们.