transactions.rb 1.18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
# frozen_string_literal: true

module Transactions
  extend ActiveSupport::Concern

  class_methods do
    # inside_transaction? will return true if the caller is running within a
    # transaction. Handles special cases when running inside a test environment,
    # where tests may be wrapped in transactions
    def inside_transaction?
11
      base = Rails.env.test? ? open_transactions_baseline.to_i : 0
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

      connection.open_transactions > base
    end

    # These methods that access @open_transactions_baseline are not thread-safe.
    # These are fine though because we only call these in RSpec's main thread.
    # If we decide to run specs multi-threaded, we would need to use something
    # like ThreadGroup to keep track of this value
    def set_open_transactions_baseline
      @open_transactions_baseline = connection.open_transactions
    end

    def reset_open_transactions_baseline
      @open_transactions_baseline = 0
    end
27 28 29 30 31 32 33 34 35 36

    def open_transactions_baseline
      return unless Rails.env.test?

      if @open_transactions_baseline.nil?
        return self == ApplicationRecord ? nil : superclass.open_transactions_baseline
      end

      @open_transactions_baseline
    end
37 38
  end
end