Module: ActiveRecord::Transactions

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
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

Instance Method Details

#add_to_transactionObject

Add the record to the current transaction so that the #after_rollback and #after_commit callbacks can be called.



363
364
365
366
367
368
369
370
371
# File 'lib/active_record/transactions.rb', line 363

def add_to_transaction
  if has_transactional_callbacks?
    self.class.connection.add_transaction_record(self)
  else
    sync_with_transaction_state
    set_transaction_state(self.class.connection.transaction_state)
  end
  remember_transaction_record_state
end

#before_committed!Object

:nodoc:



331
332
333
334
# File 'lib/active_record/transactions.rb', line 331

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.



340
341
342
343
344
345
346
347
# File 'lib/active_record/transactions.rb', line 340

def committed!(should_run_callbacks: true) #:nodoc:
  if should_run_callbacks && destroyed? || persisted?
    _run_commit_without_transaction_enrollment_callbacks
    _run_commit_callbacks
  end
ensure
  force_clear_transaction_record_state
end

#destroyObject

:nodoc:



302
303
304
# File 'lib/active_record/transactions.rb', line 302

def destroy #:nodoc:
  with_transaction_returning_status { super }
end

#rollback_active_record_state!Object

Reset id and @new_record if the transaction rolls back.



321
322
323
324
325
326
327
328
329
# File 'lib/active_record/transactions.rb', line 321

def rollback_active_record_state!
  remember_transaction_record_state
  yield
rescue Exception
  restore_transaction_record_state
  raise
ensure
  clear_transaction_record_state
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.



351
352
353
354
355
356
357
358
359
# File 'lib/active_record/transactions.rb', line 351

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
end

#saveObject

:nodoc:



306
307
308
309
310
# File 'lib/active_record/transactions.rb', line 306

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

#save!Object

:nodoc:



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

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

#touchObject

:nodoc:



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

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

#transaction(options = {}, &block) ⇒ Object

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



298
299
300
# File 'lib/active_record/transactions.rb', line 298

def transaction(options = {}, &block)
  self.class.transaction(options, &block)
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.



379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
# File 'lib/active_record/transactions.rb', line 379

def with_transaction_returning_status
  status = nil
  self.class.transaction do
    add_to_transaction
    begin
      status = yield
    rescue ActiveRecord::Rollback
      clear_transaction_record_state
      status = nil
    end

    raise ActiveRecord::Rollback unless status
  end
  status
ensure
  if @transaction_state && @transaction_state.committed?
    clear_transaction_record_state
  end
end