Module: Mongoid::Clients::Sessions::ClassMethods

Defined in:
lib/mongoid/clients/sessions.rb

Overview

Since:

  • 6.4.0

Instance Method Summary collapse

Instance Method Details

#with_session(options = {}) {|The| ... } ⇒ Object

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. You also cannot nest sessions.

Execute a block within the context of a session.

Examples:

Execute some operations in the context of a session.

Band.with_session(causal_consistency: true) do
  band = Band.create
  band.records << Record.new
  band.save
  band.reload.records
end

Parameters:

  • options (Hash) (defaults to: {})

    The session options. Please see the driver documentation for the available session options.

Yield Parameters:

  • The (Mongo::Session)

    session being used for the block.

Returns:

  • (Object)

    The result of calling the block.

Raises:

  • (Errors::InvalidSessionUse)

    If an operation is attempted on a model using another client from which the session was started or if sessions are nested.

Since:

  • 6.4.0



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/mongoid/clients/sessions.rb', line 91

def with_session(options = {})
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
  session = persistence_context.client.start_session(options)
  Threaded.set_session(session)
  yield(session)
rescue Mongo::Error::InvalidSession => ex
  if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
    raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
  end
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
ensure
  Threaded.clear_session
end