模块:Mongoid::Clients::Sessions::ClassMethods

包含在:
Mongoid
定义于:
lib/mongoid/clients/sessions.rb

常量摘要折叠

CALLBACK_ACTIONS =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

可用于trigger事务回调的操作。

%i[创建 销毁 update]

实例方法摘要折叠

实例方法详细信息

# after_commit (*args, &block) ⇒对象

设置在提交ACID 事务后调用的回调。 仅当在ACID 事务中创建、更新或销毁文档时才会回调。

有关方法参数和可能选项的更多信息,请参阅ActiveSupport::Callbacks::ClassMethods::set_callback



108
109
110
111
# File 'lib/mongoid/clients/sessions.rb', line 108

def after_commit(*args, )
  set_options_for_callbacks!(args)
  set_callback(:提交, :after, *args, )
end

# after_create_commit (*args, &block) ⇒对象

after_commit :hook, on: :create 的快捷方式。



120
121
122
123
# File 'lib/mongoid/clients/sessions.rb', line 120

def after_create_commit(*args, )
  set_options_for_callbacks!(args, 于: :create)
  set_callback(:提交, :after, *args, )
end

# after_destroy_commit (*args, &block) ⇒对象

after_commit :hook, on: :destroy 的快捷方式。



132
133
134
135
# File 'lib/mongoid/clients/sessions.rb', line 132

def after_destroy_commit(*args, )
  set_options_for_callbacks!(args, 于: :destroy)
  set_callback(:提交, :after, *args, )
end

# after_rollback (*args, &block) ⇒对象

在创建、更新或销毁回滚后调用此回调。

请查看after_commit的文档以了解选项。



140
141
142
143
# File 'lib/mongoid/clients/sessions.rb', line 140

def after_rollback(*args, )
  set_options_for_callbacks!(args)
  set_callback(:rollback, :after, *args, )
end

# after_save_commit (*args, &block) ⇒对象

快捷方式 after_commit :hook, on: [ :create, :update ]



114
115
116
117
# File 'lib/mongoid/clients/sessions.rb', line 114

def after_save_commit(*args, )
  set_options_for_callbacks!(args, 于: %i[创建 update])
  set_callback(:提交, :after, *args, )
end

# after_update_commit (*args, &block) ⇒对象

after_commit :hook, on: :update 的快捷方式。



126
127
128
129
# File 'lib/mongoid/clients/sessions.rb', line 126

def after_update_commit(*args, )
  set_options_for_callbacks!(args, 于: :update)
  set_callback(:提交, :after, *args, )
end

# ACID 事务 (options = {}, session_options: {}) { ... } ⇒对象

在ACID 事务上下文中执行区块。

如果区块没有引发错误,则提交ACID 事务。如果出现错误,ACID 事务将中止。错误将继续传递,但 Mongoid::Errors::Rollback 除外。此错误不会传递,因此如果要故意回滚ACID 事务,可以引发 is 。

参数:

  • 选项 哈希 (默认为: {}

    ACID 事务选项。有关可用的会话选项,请参阅驱动程序文档。

  • session_options 哈希 (默认为: {}

    会话选项。MongoDB 事务必须在会话内启动,因此将启动一个会话。有关可用的会话选项,请参阅驱动程序文档。

产量:

  • 提供的区块将在ACID 事务中执行。

引发:



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/mongoid/clients/sessions.rb', line 83

def 事务(选项 = {}, session_options: {}, )
  with_session(session_options) do |会话|
    会话.with_transaction(选项, ).点击 { run_commit_callbacks(会话) }
  救援 *transactions_not_supported_Exceptions
    提高 Mongoid::Errors::TransactionsNotSupported
  救援 Mongoid::Errors::Rollback
    run_abort_callbacks(会话)
  救援 Mongoid::Errors::InvalidSessionNesting
    # 会话应在此处结束。
    提高 Mongoid::Errors::InvalidTransactionNesting.new
  救援 mongo::错误::无效会话, mongo::错误::InvalidTransactionOperation => e
    run_abort_callbacks(会话)
    提高 Mongoid::Errors::TransactionError.new(e)
  救援 StandardError => e
    run_abort_callbacks(会话)
    提高 e
  end
end

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

在会话上下文中执行区块。

例子:

在会话上下文中执行某些操作。

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

参数:

  • 选项 哈希 (默认为: {}

    会话选项。有关可用的会话选项,请参阅驱动程序文档。

收益参数:

  • 使用 ( Mongo::Session )

    用于区块的会话。

返回:

  • ( Object )

    调用区块的结果。

引发:

  • ( Errors::InvalidSessionUse )

    如果尝试使用启动会话的另一个客户端对模型进行操作,或者会话是嵌套的。



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/mongoid/clients/sessions.rb', line 38

def with_session(选项 = {})
  提高 Mongoid::Errors::InvalidSessionNesting.new if 线程化.get_session(客户端: persistence_context.客户端)

  会话 = persistence_context.客户端.start_session(选项)
  线程化.set_session(会话, 客户端: persistence_context.客户端)
  产量(会话)
救援 mongo::错误::无效会话 => e
  提高 Mongoid::Errors::SessionsNotSupported.new if e.is_a?(mongo::错误::SessionsNotSupported)

  提高 e
救援 mongo::错误::OperationFailure => e
  if (e.代码 == 40 _ 415 && e.server_message =~ /startTransaction/) ||
     (e.代码 == 20 && e.server_message =~ /事务/)
    提高 Mongoid::Errors::TransactionsNotSupported.new
  else
    提高 e
  end
救援 *transactions_not_supported_Exceptions
  提高 Mongoid::Errors::TransactionsNotSupported
确保
  线程化.clear_modified_documents(会话)
  线程化.clear_session(客户端: persistence_context.客户端)
end