module Mongoid::Clients::Sessions

Encapsulates behavior for getting a session from the client of a model class or instance, setting the session on the current thread, and yielding to a block. The session will be closed after the block completes or raises an error.

@since 6.4.0

Public Instance Methods

with_session(options = {}) { |session| ... } click to toggle source

Execute a block within the context of a session.

@example Execute some operations in the context of a session.

band.with_session(causal_consistency: true) do
  band.records << Record.create
  band.name = 'FKA Twigs'
  band.save
  band.reload
end

@param [ Hash ] options The session options. Please see the driver

documentation for the available session options.

@note You cannot do any operations in the block using models or objects

that use a different client; the block will execute all operations
in the context of the implicit session and operations on any models using
another client will fail. For example, if you set a client using store_in on a
particular model and execute an operation on it in the session context block,
that operation can't use the block's session and an error will be raised.
An error will also be raised if sessions are nested.

@raise [ Errors::InvalidSessionUse ] If an operation is attempted on a model using another

client from which the session was started or if sessions are nested.

@return [ Object ] The result of calling the block.

@yieldparam [ Mongo::Session ] The session being used for the block.

@since 6.4.0

# File lib/mongoid/clients/sessions.rb, line 43
def with_session(options = {})
  if Threaded.get_session
    raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
  end
  session = persistence_context.client.start_session(options)
  Threaded.set_session(session)
  yield(session)
rescue Mongo::Error::InvalidSession => ex
  if
    # Driver 2.13.0+
    defined?(Mongo::Error::SessionsNotSupported) &&
      Mongo::Error::SessionsNotSupported === ex ||
    # Legacy drivers
    ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
  then
    raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
  end
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
ensure
  Threaded.clear_session
end

Private Instance Methods

_session() click to toggle source
# File lib/mongoid/clients/sessions.rb, line 67
def _session
  Threaded.get_session
end