Module: ActiveRecord::Transactions

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
activerecord/lib/active_record/transactions.rb

Overview

See ActiveRecord::Transactions::ClassMethods for documentation.

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

ACTIONS =

:nodoc:

[:create, :destroy, :update]

Instance Method Summary collapse

Methods included from ActiveSupport::Concern

append_features, class_methods, extended, included, prepend_features, prepended

Instance Method Details

#before_committed!Object

:nodoc:


325
326
327
328
# File 'activerecord/lib/active_record/transactions.rb', line 325

def before_committed! # :nodoc:
  _run_before_commit_without_transaction_enrollment_callbacks
  _run_before_commit_callbacks
end

#committed!(should_run_callbacks: true) ⇒ Object

Call the #after_commit callbacks.

Ensure that it is not called if the object was never persisted (failed create), but call it after the commit of a destroyed object.


334
335
336
337
338
339
340
341
342
343
# File 'activerecord/lib/active_record/transactions.rb', line 334

def committed!(should_run_callbacks: true) #:nodoc:
  force_clear_transaction_record_state
  if should_run_callbacks
    @_committed_already_called = true
    _run_commit_without_transaction_enrollment_callbacks
    _run_commit_callbacks
  end
ensure
  @_committed_already_called = @_trigger_update_callback = @_trigger_destroy_callback = false
end

#destroyObject

:nodoc:


309
310
311
# File 'activerecord/lib/active_record/transactions.rb', line 309

def destroy #:nodoc:
  with_transaction_returning_status { super }
end

#rolledback!(force_restore_state: false, should_run_callbacks: true) ⇒ Object

Call the #after_rollback callbacks. The force_restore_state argument indicates if the record state should be rolled back to the beginning or just to the last savepoint.


347
348
349
350
351
352
353
354
355
356
# File 'activerecord/lib/active_record/transactions.rb', line 347

def rolledback!(force_restore_state: false, should_run_callbacks: true) #:nodoc:
  if should_run_callbacks
    _run_rollback_callbacks
    _run_rollback_without_transaction_enrollment_callbacks
  end
ensure
  restore_transaction_record_state(force_restore_state)
  clear_transaction_record_state
  @_trigger_update_callback = @_trigger_destroy_callback = false if force_restore_state
end

#saveObject

:nodoc:


313
314
315
# File 'activerecord/lib/active_record/transactions.rb', line 313

def save(*, **) #:nodoc:
  with_transaction_returning_status { super }
end

#save!Object

:nodoc:


317
318
319
# File 'activerecord/lib/active_record/transactions.rb', line 317

def save!(*, **) #:nodoc:
  with_transaction_returning_status { super }
end

#touchObject

:nodoc:


321
322
323
# File 'activerecord/lib/active_record/transactions.rb', line 321

def touch(*, **) #:nodoc:
  with_transaction_returning_status { super }
end

#transaction(**options, &block) ⇒ Object

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


305
306
307
# File 'activerecord/lib/active_record/transactions.rb', line 305

def transaction(**options, &block)
  self.class.transaction(**options, &block)
end

#trigger_transactional_callbacks?Boolean

:nodoc:

Returns:

  • (Boolean)

381
382
383
384
# File 'activerecord/lib/active_record/transactions.rb', line 381

def trigger_transactional_callbacks? # :nodoc:
  (@_new_record_before_last_commit || _trigger_update_callback) && persisted? ||
    _trigger_destroy_callback && destroyed?
end

#with_transaction_returning_statusObject

Executes method within a transaction and captures its return value as a status flag. If the status is true the transaction is committed, otherwise a ROLLBACK is issued. In any case the status flag is returned.

This method is available within the context of an ActiveRecord::Base instance.


364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
# File 'activerecord/lib/active_record/transactions.rb', line 364

def with_transaction_returning_status
  status = nil
  self.class.transaction do
    if has_transactional_callbacks?
      add_to_transaction
    else
      sync_with_transaction_state if @transaction_state&.finalized?
      @transaction_state = self.class.connection.transaction_state
    end
    remember_transaction_record_state

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