How to force Rails ActiveRecord to commit a transaction flush

后端 未结 2 1925
自闭症患者
自闭症患者 2021-02-14 00:00

Is it possible to force ActiveRecord to push/flush a transaction (or just a save/create)?

I have a clock worker that creates tasks in the background for several task wor

相关标签:
2条回答
  • 2021-02-14 00:14

    ActiveRecord uses #transaction to create a block that begins and either rolls back or commits a transaction. I believe that would help your issue. Essentially (presuming Task is an ActiveRecord class):

    Task.transaction do
      new_task = Task.create(...)
    end
    
    BackgroundQueue.enqueue(new_task)
    

    You could also go directly to the #connection underneath with:

    Task.connection.commit_db_transaction
    

    That's a bit low-level, though, and you have to be pretty confident about the way the code is being used. #after_commit is the best answer, even if it takes a little rejiggering of the code to make it work. If it won't work for certain, then these two approaches should help.

    0 讨论(0)
  • 2021-02-14 00:16

    execute uses async_exec under the hood which may or may not be what you want. You could try using the lower level methods execute_and_clear (or even exec_no_cache) instead.

    0 讨论(0)
提交回复
热议问题