Module: ActiveRecord::Transactions

Defined in:
ext/active_record/transactions.rb

Overview

See ActiveRecord::Transactions::ClassMethods for documentation.

Instance Method Summary collapse

Instance Method Details

#save!Object

See ActiveRecord::Transactions::ClassMethods for detailed documentation.

def transaction(options = {}, &block) self.class.transaction(options, &block) end

def destroy #:nodoc:

with_transaction_returning_status { super }

end

def save(*) #:nodoc:

rollback_active_record_state! do
with_transaction_returning_status { super }
end

end



28
29
30
31
32
33
34
# File 'ext/active_record/transactions.rb', line 28

def save!(**) #:nodoc:
  if instance_variable_defined?(:@no_save_transaction) && @no_save_transaction
    super
  else
    with_transaction_returning_status { super }
  end
end

#with_transaction_returning_statusObject

def touch(*) #:nodoc:

with_transaction_returning_status { super }

end



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'ext/active_record/transactions.rb', line 41

def with_transaction_returning_status
  self.class.with_connection do |connection|
    transaction_body = proc do
      status = nil

      if sunstone? && instance_variable_defined?(:@sunstone_updating) && @sunstone_updating
        status = yield
      else
        ensure_finalize = !connection.transaction_open?
        connection.transaction do
          add_to_transaction(ensure_finalize || has_transactional_callbacks?)
          remember_transaction_record_state

          status = yield
          raise ActiveRecord::Rollback unless status
        end
        @_last_transaction_return_status = status
        status
      end
    end

    # TODO: drop this Rails 8.0 compatibility branch when Rails 8.0
    # support is dropped, and always use with_pool_transaction_isolation_level.
    # Rails 8.1 wraps the transaction in a pool-level isolation context;
    # this API doesn't exist on 8.0, so run the body directly there.
    if ActiveRecord.respond_to?(:default_transaction_isolation_level)
      connection.pool.with_pool_transaction_isolation_level(ActiveRecord.default_transaction_isolation_level, connection.transaction_open?, &transaction_body)
    else
      transaction_body.call
    end
  end
end