Rails: как откатить активную запись внутри блока with_lock? - PullRequest
1 голос
/ 05 августа 2020

Я хочу откатить транзакции внутри with_lock при совпадении условий. Я попробовал raise ActiveRecord::Rollback, но это не сработало, и записи все еще создаются. Вот краткая версия моего кода.

object.with_lock do
 a = num
 for i in [1..10] do 
  unless obj1.tickets.create(params)
    raise ActiveRecord::Rollback
  end
  a += 1
 end

 unless obj2.update_attributes(a: a) ## I tried 'if' in place of 'unless' for test
   raise ActiveRecord::Rollback
 end
end

      

EDIT1

Это то, что у меня сработало

object.with_lock do
 ActiveRecord::Base.transaction(requires_new: true) do
  a = num
  for i in [1..10] do 
   unless obj1.tickets.create(params)
     raise ActiveRecord::Rollback
   end
   a += 1
  end

  unless obj2.update_attributes(a: a)
    raise ActiveRecord::Rollback
  end
 end
end

      

1 Ответ

3 голосов
/ 05 августа 2020

Повышение отката работает внутри такой транзакции.

ApplicationRecord.transaction
  # ...
  unless obj1.tickets.create(params)
    raise ActiveRecord::Rollback, "Call tech support!"
  end
end
...