Method: Mongo::Session#abort_transaction

Defined in:
lib/mongo/session.rb

#abort_transaction(options = nil) ⇒ Object

Abort the currently active transaction without making any changes to the database.

Examples:

Abort the transaction.

session.abort_transaction

Parameters:

  • options (Hash) (defaults to: nil)

    a customizable set of options

Options Hash (options):

  • :timeout_ms (Integer)

    The operation timeout in milliseconds. Must be a non-negative integer. An explicit value of 0 means infinite. The default value is unset which means the value is inherited from the client.

Raises:

Since:

  • 2.6.0



730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
# File 'lib/mongo/session.rb', line 730

def abort_transaction(options = nil)
  QueryCache.clear

  check_if_ended!
  check_if_no_transaction!

  if within_states?(TRANSACTION_COMMITTED_STATE)
    raise Mongo::Error::InvalidTransactionOperation.new(
      Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
        :commitTransaction, :abortTransaction))
  end

  if within_states?(TRANSACTION_ABORTED_STATE)
    raise Mongo::Error::InvalidTransactionOperation.new(
      Mongo::Error::InvalidTransactionOperation.cannot_call_twice_msg(:abortTransaction))
  end

  options ||= {}

  begin
    unless starting_transaction?
      @aborting_transaction = true
      context = Operation::Context.new(
        client: @client,
        session: self,
        operation_timeouts: operation_timeouts(options)
      )
      write_with_retry(txn_options[:write_concern],
        ending_transaction: true, context: context,
      ) do |connection, txn_num, context|
        begin
          Operation::Command.new(
            selector: { abortTransaction: 1 },
            db_name: 'admin',
            session: self,
            txn_num: txn_num
          ).execute_with_connection(connection, context: context)
        ensure
          unpin
        end
      end
    end

    @state = TRANSACTION_ABORTED_STATE
  rescue Mongo::Error::InvalidTransactionOperation
    raise
  rescue Mongo::Error
    @state = TRANSACTION_ABORTED_STATE
  rescue Exception
    @state = TRANSACTION_ABORTED_STATE
    raise
  ensure
    @aborting_transaction = false
  end

  # No official return value, but return true so that in interactive
  # use the method hints that it succeeded.
  true
end