class Sequent::Core::Transactions::ActiveRecordTransactionProvider

Always require a new transaction.

Read: api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

Without this change, there is a potential bug:

“‘ruby ActiveRecord::Base.transaction do

Sequent.configuration.command_service.execute_commands command

end

on Command do

do.some.things
fail ActiveRecord::Rollback

end “‘

In this example, you might be surprised to find that ‘do.some.things` does not get rolled back! This is because AR doesn’t automatically make a “savepoint” for us when we call ‘.transaction` in a nested manner. In order to enable this behaviour, we have to call `.transaction` like this: `.transaction(requires_new: true)`.

Public Instance Methods

after_commit(&block) click to toggle source
# File lib/sequent/core/transactions/active_record_transaction_provider.rb, line 40
def after_commit(&block)
  after_commit_queue << block
end
transactional(&block) click to toggle source
# File lib/sequent/core/transactions/active_record_transaction_provider.rb, line 32
def transactional(&block)
  result = Sequent::ApplicationRecord.transaction(requires_new: true, &block)
  after_commit_queue.pop.call until after_commit_queue.empty?
  result
ensure
  clear_after_commit_queue
end

Private Instance Methods

after_commit_queue() click to toggle source
# File lib/sequent/core/transactions/active_record_transaction_provider.rb, line 46
def after_commit_queue
  Thread.current[:after_commit_queue] ||= Queue.new
end
clear_after_commit_queue() click to toggle source
# File lib/sequent/core/transactions/active_record_transaction_provider.rb, line 50
def clear_after_commit_queue
  after_commit_queue.clear
end