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
Source
# File lib/sequent/core/transactions/active_record_transaction_provider.rb, line 40 def after_commit(&block) after_commit_queue << block end
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
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
Source
# File lib/sequent/core/transactions/active_record_transaction_provider.rb, line 50 def clear_after_commit_queue after_commit_queue.clear end