クラス: Mongo::Session
- 継承:
-
オブジェクト
- オブジェクト
- Mongo::Session
- 次による拡張機能。
- 転送可能
- 次のことが含まれます。
- ClusterTime ::Consumer 、 ログ可能 、 再試行可能
- 定義:
- lib/mongo/session.rb
、lib/mongo/session/セッション_プール.rb、lib/mongo/session/server_session.rb、lib/mongo/session/server_session/dirtyable.rb
Overview
セッション オブジェクトはスレッドセーフではありません。 アプリケーションは一度に 1 つのスレッドまたはプロセスからのセッションのみを使用できます。
何らかの方法で関連するアプリケーションによって実行される一連の連続操作を表す論理セッション。
名前空間で定義済み
クラス: ServerSession, SessionPool
定数の概要の削減
- MISMATCHED_CLUSTER_ERROR_MSG =
現在使用されているクライアントとは異なるクラスターを持つクライアントからセッションが取得されたことを示すエラーメッセージ。
「このセッションを作成するために使用されるクライアントの構成は、次と一致しません」 + この操作を所有するクライアントの。このセッションは、その親である を介した操作にのみ使用してください。 + 'クライアント。'
- SESSION_ENDED_ERROR_MSG =
セッションはすでに終了しているため、使用できないことを説明するエラー メッセージ。
'このセッションは終了したため、使用できません。新しい作成してください。'- SESSIONS_NOT_SUPportED =
非推奨。
セッションがサーバー バージョンでサポートされていないことを説明するエラー メッセージ。
'セッションは接続されたサーバーではサポートされていません。'- NO_TRANSACTION_STATE =
最後の操作がどのトランザクションにも関連していないか、操作がまだ発生していないセッションの状態を指します。
:no_transaction- STARTING_TRANSACTION_STATE =
ユーザーによってトランザクションが開始されたが、トランザクション内の操作はまだ発生していないセッションの状態です。
:starting_transaction- TRANSACTION_IN_PROGESS_STATE =
トランザクションが開始され、少なくとも 1 つの操作が発生しているが、トランザクションがまだコミットまたは中止されていないセッションの状態を指します。
:transaction_in_progress- TRACTION_COMMITED_STATE =
最後に実行された操作がトランザクションでコミットされたセッションの状態を指します。
:transaction_commited- TRANSACTION_aborted_STATE =
最後に操作が実行されたセッションの状態は、トランザクションが中止されました。
:transaction_aborted- UNILED_WRITE_CONCERN_CODES =
この定数は、プライベート API の一部です。 この定数は将来削除または変更される可能性があるため、可能な限り使用しないでください。
[ 79, #UnknownReplWriteConcern 100, #CancelsifyWriteConcern、 ].freeze
Loggableに含まれる定数
インスタンス属性の概要を折りたたむ
-
#client ⇒ Client
readOnly
このセッションが作成されたクライアント。
- #cluster ⇒ Object readOnly
-
# operation_time = BSON::Timestamp
readOnly
このセッションの最新のoptime 。
-
#options ⇒ Hash
readOnly
このセッションのオプション。
-
#pinned_connection_global_id ⇒ Integer | nil
readOnly
private
このセッションが固定されている接続グローバル ID(存在する場合)。
-
#pinned_server ⇒ Server | nil
readOnly
private
このセッションが固定されているサーバー( mongos である必要がある場合)。
-
#recovery_token ⇒ BSON::Document | nil
private
このセッションで実行されているシャーディングされたトランザクションのリカバリ トークン(存在する場合)。
-
#snapshot_timestamp ⇒ BSON::Timestamp | nil
このセッションのスナップショット時間。
-
#with_transaction_deadline ⇒ Integer | nil
readOnly
private
現在のトランザクションの期限(存在する場合)。
ClusterTime::Consumerに含まれる属性
インスタンス メソッドの概要を折りたたむ
-
abort_transaction (options = nil) = オブジェクト
データベースに変更を加えずに、現在アクティブなトランザクションを中止します。
-
中止_トランザクション= true | false
private
セッションが現在トランザクションを中止しているかどうか。
-
#add_ autocommit (コマンド) = ハッシュ、BSON::ドキュメント
private
該当する場合は、コマンド ドキュメントにオートコミット フィールドを追加します。
-
Add_start_transaction。 (コマンド) = ハッシュ、BSON::ドキュメント
private
該当する場合は、 コマンド ドキュメントに startTransaction フィールドを追加します。
-
#add_txn_num (コマンド) = ハッシュ、BSON::ドキュメント
private
該当する場合は、コマンド ドキュメントにトランザクション番号を追加します。
-
#add_txn_opts!(command, _read, context) ⇒ Hash, BSON::ドキュメント
private
該当する場合は、トランザクション オプションを追加します。
-
# advanced_operation_time ( new_operation_time ) = BSON::Timestamp
このセッションのキャッシュされたoptimeを進める。
-
#causal_consistency_doc ⇒ オブジェクト
private
最後の operation time が既知であり、因果整合性が有効になっている場合は因果整合性ドキュメントを返し、そうでない場合は nil を返します。
-
# commit_transaction (options = nil) = オブジェクト
セッションで現在アクティブなトランザクションをコミットします。
-
commit_transaction は次のとおりです。 = true | false
private
セッションが現在トランザクションをコミットしているかどうか。
-
# ダーティ 。 (マーク = true) = オブジェクト
基礎となるサーバーセッションの指定された値にダーティ状態を設定します。
-
# ダーティー= true | false | nil
private
基礎となるサーバーセッションがダーティであるかどうか。
-
#end_session ⇒ nil
このセッションを終了します。
-
#は終了しましたか? = true、false
このセッションが終了したかどうか。
-
明示的かどうか= true、false
このセッションは明示的なもの(つまり ユーザーが作成した)。
-
暗黙的な ではありませんか。 = true、false
このセッションは暗黙的なセッション(ユーザーが作成したものではない)。
-
in_transaction は をサポートしていますか。 = true | false
セッションが現在トランザクション内であるかどうか。
-
#初期化(server_session, クライアント, オプション = {}) = セッション
コンストラクター
private
セッションを初期化します。
-
#inside_with_transaction? ⇒ Boolean
private
現在 with_transaction ブロック内にあるかどうか。
-
詳しくは、 を 検査し ますstring
検査で使用するための書式設定された string を取得します。
-
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
private
まだ設定されていない場合は、セッション プールからセッションをチェックアウトして、セッション オブジェクトの server_session を入力します。
- #マテリアライズド? = ブール値 private
-
# next_txn_num =整数
private
インクリメントして次のトランザクション番号を返します。
-
# point_to_connection(connection_global_id, connection: nil) = オブジェクト
private
このセッションを指定された接続に固定します。
-
#ping_to_server (サーバー) = Object
private
は、このセッションを指定されたサーバー( mongos である必要がある)に固定します。
-
プロセス(結果) = プロセス::結果
private
このセッションを使用したサーバーからの応答を処理します。
-
再試行_読み取りの回数 = ブール値
private
このセッションで実行された読み取りを、最新の 再試行可能な読み取りの仕様 に従って再試行できるかどうか。
-
retry_writes? = true、false
このセッションで実行された書き込みが再試行されます。
-
#revert_to_starting_transaction! ⇒ オブジェクト
private
セッション状態を STARTING_TRANSACTION_STATE に戻します。
-
#session_id ⇒ BSON::Document
セッションが終了されていない場合は、このセッションのサーバー セッション ID を取得します。
-
#スナップショット= true | false
セッションがスナップショット読み取り用に構成されているかどうか。
-
# start_transaction (options = nil) = オブジェクト
このセッションの後続の操作を新しいトランザクションに配置します。
- 開始_トランザクション= ブール値 private
-
次を使用して、_read_write_concernを使用します。 (コマンド) = ハッシュ、BSON::ドキュメント
private
該当しない場合は、コマンドから読み取り保証や書込み保証を削除します。
-
#txn_num ⇒ Integer
現在のトランザクション番号を取得します。
-
#txn_options ⇒ Hash
このセッションでは。
-
#txn_read_concern ⇒ ハッシュ化された
private
トランザクションの開始時にセッションが使用する読み取り保証 (read concern)を取得します。
-
# txn_read_preference =ハッシュ
現在アクティブなトランザクションでセッションが使用する読み込み設定 (read preference) を取得します。
-
#解除(接続 = nil) = オブジェクト
private
セッションが固定されている場合は、固定されたサーバーまたは接続からこのセッションの固定を解除します。
-
#unping_maybe (error, connection = nil) = nil) = オブジェクト
private
セッションが固定され、指定された例外インスタンスとセッションのトランザクション状態で固定を解除する必要がある場合は、このセッションを固定されたサーバーまたは接続から固定を解除します。
-
#update_state! ⇒ Object
private
(コミット以外と中止以外の)操作が実行されているため、セッションの状態を更新します。
-
#validate!(client) ⇒ Session
private
指定されたクライアントが使用するセッションを検証します。
-
# validate_read_preference (コマンド) = オブジェクト
private
コマンドの読み込み設定 (read preference)がプライマリであることを確認します。
-
# with_transaction (オプション = nil) = オブジェクト
トランザクションで指定されたブロックを実行し、必要に応じて再試行します。
ClusterTime::Consumerに含まれるメソッド
Loggableに含まれるメソッド
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
再試行可能な に含まれるメソッド
#read_worker、#select_server、#with_overload_retry、#write_worker
コンストラクターの詳細
#初期化(server_session, クライアント, オプション = {}) =セッション
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
アプリケーションは Client#start_session を使用してセッションを開始する必要があります。 このコンストラクターは、ドライバー内部でのみ使用します。
セッションを初期化します。
セッションは明示的または暗黙的に実行できます。明示的なセッションの有効期間はアプリケーションによって管理されます。アプリケーションはこのようなセッションを明示的に作成し、明示的に終了します。暗黙的なセッションはドライバーによって自動的に作成され、その有効期間はドライバーによってマネージドされます。
暗黙的なセッションが作成される場合、そのセッションに関連付けられたサーバー セッションを持つことはできません。 このセッションを使用する操作が実際に実行されると、サーバー セッションはセッション プールからチェックアウトされます。 明示的なセッションが作成される場合は、すでに割り当てられているサーバー セッションを参照する必要があります。
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# ファイル 'lib/mongo/session.rb', 行 82 デフォルト 初期化(server_session, クライアント, = {}) 場合 [:causal_consistency] & & [:snapshot] 発生 ArgumentError, :causal_consistency と :snapshot の 両方 の オプションは、セッションで両方に設定することはできません 。 end 場合 [:snapshot_time] & & ![:snapshot] 発生 ArgumentError, ':snapshot_time は :スナップショット が true の場合にのみ設定できます' end 場合 [:snapshot_time] & & ![:snapshot_time].is_a?(BSON::タイムスタンプ) 発生 ArgumentError, ':snapshot_time は BSON::Timestamp である必要があります' end 場合 [:implicit] ただし、 server_session.nil? 発生 ArgumentError, 暗黙的 な セッションは構築中にサーバー セッションを参照できません 。 end elsif server_session.nil? 発生 ArgumentError, '明示的なセッションは構築中にサーバー セッションを参照する必要があります' end @server_session = server_session = .dup 暗黙的なセッションでは、クラスターとクライアントのオプションのみが必要です(絶対に実行されない トランザクション)、そのため、Mongo::クライアントのクローン作成を避けてください。 # メモリ リーク: 代わりに元のクライアントを直接使用します。 @client = [:implicit] ? クライアント : クライアント.使用(:admin) @cluster = @client.クラスター @options = .dup.freeze @cluster_time = nil @ State = NO_TRANSACTION_STATE @with_transaction_readline = nil @with_transaction_timeout_ms = nil @inide_with_transaction = false @snapshot_timestamp = [:snapshot_time] end |
インスタンス属性の詳細
#クライアント=クライアント(読み取り専用)
このセッションが作成されたクライアントを返します。
128 129 130 |
# ファイル 'lib/mongo/session.rb', 行 128 デフォルト クライアント @client end |
#クラスター=オブジェクト(読み取り専用)
130 131 132 |
# ファイル 'lib/mongo/session.rb', 行 130 デフォルト クラスター @cluster end |
# operation_time = BSON::Timestamp (readonly)
このセッションの最新のoptimeを返します。
141 142 143 |
# ファイル 'lib/mongo/session.rb', 行 141 デフォルト operation_time @operation_time end |
オプション=ハッシュ(読み取り専用)
このセッションの オプションを返します。
123 124 125 |
# ファイル 'lib/mongo/session.rb', 行 123 デフォルト @options end |
#ピン留め_接続_グローバル_id =整数 | 整数 | nil (読み取り専用)
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
このセッションが固定されている場合は、接続グローバル ID を返します。
292 293 294 |
# ファイル 'lib/mongo/session.rb', 行 292 デフォルト ピン留め_接続_グローバル_id @finned_ connection_ global_id end |
#ピン留め_サーバー =サーバー| nil (読み取り専用)
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
このセッションが固定されているサーバー(mongos である必要がある場合)を返します。
286 287 288 |
# ファイル 'lib/mongo/session.rb', 行 286 デフォルト completed_server @finned_server end |
#recovery_token ⇒ BSON::Document | nil
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
このセッションで実行されているシャーディングされたトランザクションのリカバリ トークン(存在する場合)を返します。
298 299 300 |
# ファイル 'lib/mongo/session.rb', 行 298 デフォルト リカバリ_トークン @recury_token end |
#snapshot_timestamp ⇒ BSON::Timestamp | nil
返します。このセッションのスナップショット時間。セッションがスナップショットセッションでない場合、または :snapshot_time オプションが提供されていないスナップショットセッションで、まだ読み取りでサーバーから atClusterTime がキャプチャされていない場合は nil。
1287 1288 1289 |
# ファイル 'lib/mongo/session.rb', 行 1287 デフォルト @snapshot_timestamp end |
# with_transaction_readline ⇒ 整数 | nil (読み取り専用)
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
現在のトランザクションの期限(存在する場合)を返します。
1303 1304 1305 |
# ファイル 'lib/mongo/session.rb', 行 1303 デフォルト with_transaction_readline @with_transaction_readline end |
インスタンス メソッドの詳細
abort_transaction (options = nil) = オブジェクト
データベースに変更を加えずに、現在アクティブなトランザクションを中止します。
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 |
# ファイル 'lib/mongo/session.rb', 行 810 デフォルト abort_transaction( = nil) クエリ キャッシュ.クリア checkpoint_if_endd. checkpoint_if_no_transaction. 場合 Within(TRACTION_COMMITED_STATE) 発生 mongo::エラー::InvalidTransactionOperation.新着情報( mongo::エラー::InvalidTransactionOperation.canド_back_ after_msg( :commitTransaction, :abortTransaction ) ) end 場合 Within(TRANSACTION_ABORTED_STATE) 発生 mongo::エラー::InvalidTransactionOperation.新着情報( mongo::エラー::InvalidTransactionOperation.canド_呼び出し_twice_msg(:abortTransaction) ) end ||= {} begin ただし、 start_transaction? @aboring_transaction = true context = 操作::Context.新着情報( クライアント: @client, セッション: 自己, operation_timeouts: operation_timeouts() ) write_with_retry([:write_concern], termination_transaction: true, context: context) 行う |接続, txn_num, context| 操作 = 操作::コマンド.新着情報( セレクター: { abortTransaction: 1 }, db_name: ' admin ', セッション: 自己, txn_num: txn_num ) 追跡.track_operation(操作, context, op_name: 'abortTransaction') 行う 操作.execution_with_ connection(接続, context: context) end 保証する unpin end end 状態を変更する前にトランザクション範囲を完了する 追跡.final_transaction_span(自己) @ State = TRANSACTION_ABORTED_STATE ヘルプ mongo::エラー::InvalidTransactionOperation 発生 ヘルプ mongo::エラー 追跡.final_transaction_span(自己) @ State = TRANSACTION_ABORTED_STATE ヘルプ 例外 追跡.final_transaction_span(自己) @ State = TRANSACTION_ABORTED_STATE 発生 保証する @aboring_transaction = false end #正規の戻り値ではありませんが、true を返すため、対話型では 成功したことを示す メソッドを使用します。 true end |
中止_トランザクション= true | false
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
セッションが現在トランザクションを中止しているかどうかを返します。
906 907 908 |
# ファイル 'lib/mongo/session.rb', 行 906 デフォルト aborting_transaction !!@aboring_transaction end |
#add_ autocommit (コマンド) =ハッシュ、 BSON::Document
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
該当する場合は、コマンド ドキュメントにオートコミット フィールドを追加します。
999 1000 1001 1002 1003 |
# ファイル 'lib/mongo/session.rb', 行 999 デフォルト Add_Autocommit.(コマンド) コマンド.タップ 行う |c| c[: 自動コミット] = false 場合 in_transaction? end end |
Add_start_transaction。 (コマンド) =ハッシュ、 BSON::Document
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
該当する場合は、 コマンド ドキュメントに startTransaction フィールドを追加します。
1014 1015 1016 1017 1018 |
# ファイル 'lib/mongo/session.rb', 行 1014 デフォルト add_start_transaction.(コマンド) コマンド.タップ 行う |c| c[:startTransaction] = true 場合 start_transaction? end end |
#add_txn_num (コマンド) =ハッシュ、 BSON::Document
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
該当する場合は、コマンド ドキュメントにトランザクション番号を追加します。
1029 1030 1031 1032 1033 |
# ファイル 'lib/mongo/session.rb', 行 1029 デフォルト add_txn_num!(コマンド) コマンド.タップ 行う |c| c[:txnNumber] = BSON::Int64.新着情報(@server_session.txn_num) 場合 in_transaction? end end |
# add_txn_opts! を使用します。 (コマンド、_read、コンテキスト)⇒ Hash、BSON::ドキュメント
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
該当する場合は、トランザクション オプションを追加します。
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 |
# ファイル 'lib/mongo/session.rb', 行 1044 デフォルト add_txn_opts。(コマンド, _read, context) コマンド.タップ 行う |c| # 読み取り保証は、トランザクションを開始する任意のコマンドに追加する必要があります。 場合 start_transaction? # https://JIRA.mongodb.org/browse/Spec-{0 1161 : トランザクションの 読み取り保証 (read concern) がコレクション/データベース/クライアントの読み取り保証 (read concern) を上書きする トランザクションの読み取り保証(read concern)が設定されていない場合でも。 # 読み取り保証 (read concern) はサーバーに送信されたものであり、 # afterClusterTime を含みます。 場合 (rc = c[:readConcern]) rc = rc.dup rc.削除(: レベル) end 場合 txn_read_concern 場合 rc rc.update(txn_read_concern) else rc = txn_read_concern.dup end end 場合 rc.nil? || rc.空の場合 c.削除(:readConcern) else c[:readConcern] = オプション::マッパー.transform_values_to_strings(rc) end end # 読み取り保証レベルは、シンボルではなく string として送信する必要があります。 c[:readConcern] = オプション::マッパー.transform_values_to_strings(c[:readConcern]) 場合 c[:readConcern] 場合 c[:commitTransaction] & & (max_time_ms = [:max_commit_time_ms]) c[:maxTimeMS] = max_time_ms end 書込み保証 (write concern) は、任意の abortTransaction コマンドまたは commitTransaction コマンドに追加する必要があります。 場合 c[:abortTransaction] || c[:commitTransaction] 場合 @already_commited wc = BSON::ドキュメント.新着情報(c[:writeConcern] || txn_write_concern || {}) wc.mergeします。(w: :majority) wc[:wtimeout] ||= 10_000 c[:writeConcern] = wc elsif txn_write_concern c[:writeConcern] ||= txn_write_concern end end 非数値の書込み保証 (write concern) w 値は、記号ではなく string として送信する必要があります。 場合 c[:writeConcern] & & c[:writeConcern][:w] & & c[:writeConcern][:w].is_a?(シンボル) c[:writeConcern][:w] = c[:writeConcern][:w].to_s end # Ignore wtimeout if csot c[:writeConcern]&.削除(:wtimeout) 場合 context&.csot? 空の(サーバーのデフォルト)書込み保証(書込み保証 (write concern))は送信されません。 c.削除(:writeConcern) 場合 c[:writeConcern] & & c[:writeConcern].空の場合 end end |
# advanced_operation_time ( new_operation_time ) = BSON::Timestamp
このセッションのキャッシュされたoptimeを進める。
1223 1224 1225 1226 1227 1228 1229 |
# ファイル 'lib/mongo/session.rb', 行 1223 デフォルト advanced_operation_time(new_operation_time) @operation_time = 場合 @operation_time [ @operation_time, new_operation_time ].最大 else new_operation_time end end |
#causal_consistency_doc ⇒ オブジェクト
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
最後の operation time が既知であり、因果整合性が有効になっている場合は因果整合性ドキュメントを返し、そうでない場合は nil を返します。
1331 1332 1333 1334 1335 |
# ファイル 'lib/mongo/session.rb', 行 1331 デフォルト causal_consistency_doc return ただし、 operation_time & & causal_consistency? { afterClusterTime: operation_time } end |
# commit_transaction (options = nil) =オブジェクト
セッションで現在アクティブなトランザクションをコミットします。
724 725 726 727 728 729 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 789 790 791 792 793 794 795 |
# ファイル 'lib/mongo/session.rb', 行 724 デフォルト commit_transaction( = nil) クエリ キャッシュ.クリア checkpoint_if_endd. checkpoint_if_no_transaction. 場合 Within(TRANSACTION_ABORTED_STATE) 発生 mongo::エラー::InvalidTransactionOperation.新着情報( mongo::エラー::InvalidTransactionOperation.canド_back_ after_msg( :abortTransaction, :commitTransaction ) ) end ||= {} begin # commitTransaction が 2 回呼び出される場合は、同じコミットを実行する必要があります # 操作が再度実行されるため、セッションは以前の状態に戻ります。 場合 Within(TRACTION_COMMITED_STATE) @ State = @last_commit_skip ? STARTING_TRANSACTION_STATE : TRANSACTION_IN_PROGESS_STATE @already_commited = true end 場合 start_transaction? @last_commit_skip = true else @last_commit_skip = false @commiting_transaction = true write_concern = [:write_concern] || [:write_concern] write_concern = WriteConcern.得る(write_concern) 場合 write_concern & & !write_concern.is_a?(WriteConcern::Base) context = 操作::Context.新着情報( クライアント: @client, セッション: 自己, operation_timeouts: operation_timeouts() ) write_with_retry(write_concern, termination_transaction: true, context: context) 行う |接続, txn_num, context| 場合 context.再試行しますか? & & !context.overload_only_retry? 場合 write_concern wco = write_concern..merge(w: :majority) wco[:wtimeout] ||= 10_000 write_concern = WriteConcern.得る(wco) else write_concern = WriteConcern.得る(w: :majority, wtimeout: 10_000) end end スペック = { セレクター: { commitTransaction: 1 }, db_name: ' admin ', セッション: 自己, txn_num: txn_num, write_concern: write_concern, } 操作 = 操作::コマンド.新着情報(スペック) 追跡.track_operation(操作, context, op_name: 'commitTransaction') 行う 操作.execution_with_ connection(接続, context: context) end end end 状態を変更する前にトランザクション範囲を完了する 追跡.final_transaction_span(自己) 保証する @ State = TRACTION_COMMITED_STATE @commiting_transaction = false end #正規の戻り値ではありませんが、true を返すため、対話型では 成功したことを示す メソッドを使用します。 true end |
commit_transaction は次のとおりです。 = true | false
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
セッションが現在トランザクションをコミットしているかどうかを返します。
898 899 900 |
# ファイル 'lib/mongo/session.rb', 行 898 デフォルト commit_transaction? !!@commiting_transaction end |
# ダーティ 。 (マーク = true) = オブジェクト
基礎となるサーバーセッションの指定された値にダーティ状態を設定します。 サーバーセッションがない場合、これは何も行いません。
150 151 152 |
# ファイル 'lib/mongo/session.rb', 行 150 デフォルト dirty!(マーク = true) @server_session&.dirty!(マーク) end |
# ダーティー= true | false | nil
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
基礎となるサーバーセッションがダーティであるかどうかを返します。 このセッションのサーバーセッションが存在しない場合、 は nil を返します。
158 159 160 |
# ファイル 'lib/mongo/session.rb', 行 158 デフォルト dirty? @server_session&.dirty? end |
#end_session ⇒ nil
このセッションを終了します。
このセッションで進行中のトランザクションがある場合、そのトランザクションは中止されます。 このセッションに関連付けられたサーバー セッションは、サーバー セッション プールに返されます。 最後に、このセッションは終了としてマークされ、使用できなくなります。
このセッションがすでに終了している場合、このメソッドは何も行いません。
このメソッドでは、名前から提案される内容とは異なり、このサーバーに endSessions コマンドを直接発行しないことに注意してください。
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 |
# ファイル 'lib/mongo/session.rb', 行 385 デフォルト end_session 場合 !終了しました & & @client 場合 Within(TRANSACTION_IN_PROGESS_STATE) begin abort_transaction ヘルプ mongo::エラー, エラー::AuthError end end # 固定された接続を解放します (例:トランザクションがコミットされた後) 負荷分散モードでは # )です。 unpin 場合 ピン留め_接続_グローバル_id クラスター.session_pool.checkin(@server_session) 場合 @server_session end 保証する @server_session = nil @end = true @client = nil end |
#は終了しましたか? = true 、 false
このセッションが終了したかどうか。
255 256 257 |
# ファイル 'lib/mongo/session.rb', 行 255 デフォルト 終了しました !!@end end |
明示的かどうか = true 、 false
このセッションは明示的なもの(つまり ユーザーが作成した)。
190 191 192 |
# ファイル 'lib/mongo/session.rb', 行 190 デフォルト explicit? !implicit? end |
暗黙的な ではありませんか。 = true 、 false
このセッションは暗黙的なセッション(ユーザーが作成したものではない)。
178 179 180 |
# ファイル 'lib/mongo/session.rb', 行 178 デフォルト implicit? @implicit ||= !!(@options.key?(:implicit) & & @options[:implicit] == true) end |
in_transaction は をサポートしていますか。 = true | false
セッションが現在トランザクション内であるかどうか。
890 891 892 |
# ファイル 'lib/mongo/session.rb', 行 890 デフォルト in_transaction? Within(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGESS_STATE) end |
#inside_with_transaction? ⇒ Boolean
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
現在 with_transaction ブロック内にあるかどうかを返します。
1307 1308 1309 |
# ファイル 'lib/mongo/session.rb', 行 1307 デフォルト Within_with_transaction @inide_with_transaction end |
詳しくは、 を 検査しstring ます
検査で使用するための書式設定された string を取得します。
363 364 365 |
# ファイル 'lib/mongo/session.rb', 行 363 デフォルト 検査する " #< Mongo::Session: 0 x #{ object_id } session_id= #{ session_id } options= #{ @options } > " end |
Atlas の サンプル データ セット からの映画 データを含むコレクションを使用します 。
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
まだ設定されていない場合は、セッション プールからセッションをチェックアウトして、セッション オブジェクトの server_session を入力します。
1237 1238 1239 1240 1241 1242 1243 1244 1245 |
# ファイル 'lib/mongo/session.rb', 行 1237 デフォルト マテリアライズドの場合 発生 エラー::SessionEned 場合 終了しました return ただし、 implicit? & & !@server_session @server_session = クラスター.session_pool.チェックアウト 自己 end |
#マテリアライズド? =ブール値
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
1248 1249 1250 1251 1252 |
# ファイル 'lib/mongo/session.rb', 行 1248 デフォルト マテリアライズド? 発生 エラー::SessionEned 場合 終了しました !@server_session.nil? end |
# next_txn_num =整数
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
インクリメントして次のトランザクション番号を返します。
1263 1264 1265 1266 1267 |
# ファイル 'lib/mongo/session.rb', 行 1263 デフォルト next_txn_num 発生 エラー::SessionEned 場合 終了しました @server_session.next_txn_num end |
# point_to_ connection ( connection_ global_id, connection: nil) = オブジェクト
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
このセッションを指定された接続に固定します。
このセッションは になります。
932 933 934 935 936 937 |
# ファイル 'lib/mongo/session.rb', 行 932 デフォルト point_to_ connection(connection_ global_id, 接続: nil) 発生 ArgumentError, ' nil 接続 ID にピン留めできません' 場合 connection_ global_id.nil? @finned_ connection_ global_id = connection_ global_id @pinged_ connection = 接続 end |
#ping_to_server (サーバー) = Object
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
は、このセッションを指定されたサーバー( mongos である必要がある)に固定します。
915 916 917 918 919 920 921 922 923 |
# ファイル 'lib/mongo/session.rb', 行 915 デフォルト point_to_server(サーバー) 発生 ArgumentError, ' nil サーバーにピン留めできません' 場合 サーバー.nil? 場合 Lint.有効か & & !サーバー.mongos? 発生 エラー::LintError, 「 セッションを mongos ではない サーバー #{ server . Summary } に固定しようとしました 。 end @finned_server = サーバー end |
プロセス(結果) = プロセス::結果
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
このセッションを使用したサーバーからの応答を処理します。
1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 |
# ファイル 'lib/mongo/session.rb', 行 1197 デフォルト プロセス(結果) ただし、 implicit? set_operation_time(結果) 場合 (cluster_time_doc = 結果.cluster_time) advanced_cluster_time(cluster_time_doc) end end @server_session.set_last_use! 場合 (doc = 結果.応答 & & 結果.応答.ドキュメント.最初に) & & doc[:recoveryToken] 自己.リカバリ_トークン = doc[:recoveryToken] end 結果 end |
再試行_読み取りの回数 =ブール値
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
このセッションで実行された読み取りを、最新の 再試行可能な読み取りの仕様 に従って再試行できるかどうか。
このメソッドが true を返す場合、最新の再試行可能な読み取りはアプリケーションによってリクエストされています。 読み取り操作に選択されたサーバーが最新の再試行可能な読み取りをサポートしている場合は、その特定の操作にそれらが使用されます。 読み取り操作に選択されたサーバーが最新の再試行可能な読み取りをサポートしていない場合、読み取りは再試行されません。
このメソッドが false を返す場合、アプリケーションによってレガシーの再試行可能な読み取りがリクエストされています。 クライアントが接続しているサーバーのサーバー バージョンに関係なく、レガシーの再試行可能な読み取りロジックが使用されます。 読み取り再試行の回数は、 :max_read_retry クライアント オプションによって指定されます。このオプションはデフォルトで1であり、レガシー読み取り再試行を無効にするには0に設定できます。
210 211 212 |
# ファイル 'lib/mongo/session.rb', 行 210 デフォルト retry_reads? クライアント.[:retry_reads] != false end |
retry_writes? = true 、 false
再試行可能な書き込みは、クラスター、レプリカセット、または負荷分散されたトポロジーでのみ使用できます。
このセッションで実行された書き込みが再試行されます。
225 226 227 |
# ファイル 'lib/mongo/session.rb', 行 225 デフォルト retry_writes? !!クライアント.[:retry_writes] & & (クラスター.replica_set? || クラスター.シャーディングされたかどうか || クラスター.load_Balanced?) end |
#revert_to_starting_transaction! ⇒ オブジェクト
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
セッション状態を STARTING_TRANSACTION_STATE に戻します。トランザクション の最初のコマンドを再試行する前に呼び出され、 startTransaction: true が再試行時に保持されます。
1148 1149 1150 1151 1152 |
# ファイル 'lib/mongo/session.rb', 行 1148 デフォルト return_to_starting_transaction. return ただし、 Within(TRANSACTION_IN_PROGESS_STATE) @ State = STARTING_TRANSACTION_STATE end |
#session_id ⇒ BSON::Document
セッションが終了されていない場合は、このセッションのサーバー セッション ID を取得します。 セッションが終了した場合、 は Error::SessionEned を発生させます。
267 268 269 270 271 272 273 274 275 276 277 278 279 280 |
# ファイル 'lib/mongo/session.rb', 行 267 デフォルト Session_id 発生 エラー::SessionEned 場合 終了しました #明示的なセッションには常にsession_idが付与されます。これは実行中であるためです。 サーバー セッションの構築を提供する必要があります。 暗黙的なセッション は具体化されるまでセッション_idを持たないため、 は #session_id は失敗する可能性があります。 アプリケーションに機会があってはなりません 暗黙的なセッションは次ではないとして、この失敗が発生します: アプリケーションがアクセスできるのは、アプリケーションの有効期間が次のように制限されているためです。 これはドライバーによって完全に実行されます。 発生 エラー::SessionNot マテリアライズド ただし、 マテリアライズド? @server_session.Session_id end |
#スナップショット = true | false
セッションがスナップショット読み取り用に構成されているかどうかを返します。
134 135 136 |
# ファイル 'lib/mongo/session.rb', 行 134 デフォルト スナップショット !![:snapshot] end |
# start_transaction (options = nil) =オブジェクト
このセッションの後続の操作を新しいトランザクションに配置します。
start_transaction が呼び出された後に操作が実行されるまで、サーバー上でトランザクションは開始されないことに注意してください。
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 |
# ファイル 'lib/mongo/session.rb', 行 660 デフォルト start_transaction( = nil) checkpoint_transactions_supported. 場合 Lint.validate_read_concern_option([:read_concern]) # ここで無効な読み込み設定(read preference)を検出すると便利ですが、 一部の仕様テストでは、無効な読み込み設定(read preference)を後で検出する必要があります。 # # intモードがオンの場合にこれを実行できる可能性があります。 # モード = options[:read] &=options[:read][: モード].to_s モードとモードが .= 'プライマリ' 場合 Mongo::Error::InvalidTransactionOperation.new( #「トランザクション内の読み込み設定 (read preference)はプライマリである必要があります(リクエスト: #{モード})」 # ) # end end 発生 mongo::エラー::SnapshotSessionTransactionProvided 場合 スナップショット checkpoint_if_endd. 場合 Within(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGESS_STATE) 発生 mongo::エラー::InvalidTransactionOperation.新着情報( mongo::エラー::InvalidTransactionOperation::TRANSACTION_ALREADI_IN_PROGESS ) end unpin next_txn_num @txn_options = (@options[:default_transaction_options] || {}).merge( || {}) 場合 txn_write_concern & & !WriteConcern.得る(txn_write_concern).確認済み? 発生 mongo::エラー::InvalidTransactionOperation.新着情報( mongo::エラー::InvalidTransactionOperation::Unacknowledged_WRITE_CONCERN ) end @ State = STARTING_TRANSACTION_STATE @already_commited = false 追跡.start_transaction_span(自己) # このメソッドには明示的な戻り値はありません。 #ここで nil を返すことができますが、true はユーザーに # 操作が成功しました。 これは対話型の使用を目的としています。 戻り値は文書化されていないことに注意してください。 true end |
開始_トランザクション=ブール値
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
878 879 880 |
# ファイル 'lib/mongo/session.rb', 行 878 デフォルト start_transaction? Within(STARTING_TRANSACTION_STATE) end |
次を使用して、_read_write_concernを使用します。 (コマンド) =ハッシュ、 BSON::Document
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
該当しない場合は、コマンドから読み取り保証や書込み保証を削除します。
1112 1113 1114 1115 1116 1117 1118 1119 |
# ファイル 'lib/mongo/session.rb', 行 1112 デフォルト sink_read_write_concern を使用します。(コマンド) コマンド.タップ 行う |c| 次へ ただし、 in_transaction? c.削除(:readConcern) ただし、 start_transaction? c.削除(:writeConcern) ただし、 c[:commitTransaction] || c[:abortTransaction] end end |
#txn_num ⇒ Integer
現在のトランザクション番号を取得します。
1277 1278 1279 1280 1281 |
# ファイル 'lib/mongo/session.rb', 行 1277 デフォルト txn_num 発生 エラー::SessionEned 場合 終了しました @server_session.txn_num end |
#txn_options ⇒ Hash
このセッションでは。
166 167 168 |
# ファイル 'lib/mongo/session.rb', 行 166 デフォルト @txn_options or 発生 ArgumentError, 「アクティブなトランザクションがありません」 end |
#txn_read_concern ⇒ ハッシュ
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
トランザクションの開始時にセッションが使用する読み取り保証 (read concern)を取得します。
これはアンダースコア キーを持つドライバー スタイルのハッシュです。
1322 1323 1324 1325 |
# ファイル 'lib/mongo/session.rb', 行 1322 デフォルト txn_read_concern # 読み取り保証 (read concern) はクライアントから継承されますが、db またはコレクションからは継承されません。 [:read_concern] || @client.read_concern end |
# txn_read_preference =ハッシュ
現在アクティブなトランザクションでセッションが使用する読み込み設定 (read preference) を取得します。
これはアンダースコア キーを持つドライバー スタイルのハッシュです。
240 241 242 243 244 245 |
# ファイル 'lib/mongo/session.rb', 行 240 デフォルト txn_read_preference rp = [:read] || @client.read_preference mongo::Lint.validate_userscore_read_preference(rp) rp end |
#解除(接続 = nil) =オブジェクト
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
セッションが固定されている場合は、固定されたサーバーまたは接続からこのセッションの固定を解除します。
945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 |
# ファイル 'lib/mongo/session.rb', 行 945 デフォルト unpin(接続 = nil) # 冪等: クリアするピン留められた状態がない場合は、何もしません。ネストされた # unpin_maybe ハンドラー(例えば、BulkWrite#execute_operation でラップされている # OpMsg 実行(すでに自身の do_execute で unpin_maybe を呼び出している) # 同じエラーに対してこのメソッドを 2 回呼び出すことができます。接続を確認しています。 # back into the pool a second time would raise from the pool. return 場合 @finned_server.nil? & & @pinged_ connection.nil? & & @finned_ connection_ global_id.nil? @finned_server = nil @finned_ connection_ global_id = nil conn = 接続 || @pinged_ connection 場合 conn conn.unpin(トランザクション) 他の接続を監視します。 # はまだその上にピンを保持しています(例: オープン カーソル)。 ただし、 conn.ピン留めされたかどうか conn.connection_Pool.checkpoint_in(conn) end end @pinged_ connection = nil end |
#unping_maybe (error, connection = nil) = nil) =オブジェクト
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
セッションが固定され、指定された例外インスタンスとセッションのトランザクション状態で固定を解除する必要がある場合は、このセッションを固定されたサーバーまたは接続から固定を解除します。
例外インスタンスには、すでにすべてのラベルが設定されている必要があります(クライアントとサーバー側で生成されたラベルの両方)。
978 979 980 981 982 983 984 985 986 987 988 |
# ファイル 'lib/mongo/session.rb', 行 978 デフォルト unping_maybe(エラー, 接続 = nil) 場合 !Within(セッション::NO_TRANSACTION_STATE) & & エラー.ラベル('TransientTransactionError') unpin(接続) end 場合 commit_transaction? & & エラー.ラベル(「 UnknownTransactionCommitResult 」) unpin(接続) end end |
#update_state! ⇒ Object
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
(コミット以外と中止以外の)操作が実行されているため、セッションの状態を更新します。
1158 1159 1160 1161 1162 1163 1164 1165 |
# ファイル 'lib/mongo/session.rb', 行 1158 デフォルト update_state! ケース @ State 次の場合: STARTING_TRANSACTION_STATE @ State = TRANSACTION_IN_PROGESS_STATE 次の場合: TRACTION_COMMITED_STATE, TRANSACTION_ABORTED_STATE @ State = NO_TRANSACTION_STATE end end |
#validate!(client) ⇒ Session
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
指定されたクライアントが使用するセッションを検証します。
セッションは終了してはならず、セッションが使用されるクライアントと同じクラスターを持つクライアントによって作成された必要があります。
1180 1181 1182 1183 1184 |
# ファイル 'lib/mongo/session.rb', 行 1180 デフォルト validate!(クライアント) checkpoint_if_endd. checkpoint_matching_cluster.(クライアント) 自己 end |
# validate_read_preference (コマンド) =オブジェクト
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
コマンドの読み込み設定 (read preference)がプライマリであることを確認します。
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 |
# ファイル 'lib/mongo/session.rb', 行 1131 デフォルト validate_read_preference!(コマンド) return ただし、 in_transaction? return ただし、 コマンド[' $readPreference '] モード = コマンド[' $readPreference ']['mode'] || コマンド[' $readPreference '][: モード] return ただし、 モード & & モード != 'プライマリ' 発生 mongo::エラー::InvalidTransactionOperation.新着情報( "トランザクション内の読み込み設定 (read preference) はプライマリである必要があります(リクエスト: #{モード} ) ] ) end |
# with_transaction (オプション = nil) =オブジェクト
with_transaction にはループが含まれているため、with_transaction 自体がループに配置されている場合、そのブロックは外側のループを制御するために次の または ブレークを呼び出してはなりません。これは代わりに with_transaction のループに影響するためです。 ドライバーは、この状況を検出すると、トランザクションを警告して中止します。
トランザクションで指定されたブロックを実行し、必要に応じて再試行します。
ブロックの戻り値を返します。
再試行の正確な回数と実行されるタイミングは、ドライバーの詳細な実装です。提供されたブロックは冪等である必要があり、複数回呼び出されるように準備されている必要があります。 ドライバーは、発生したエラーに応じて、アクティブなトランザクション内でコミット コマンドを再試行するか、トランザクションを繰り返してブロックを再度呼び出す場合があります。 また、再試行は異なるサーバーに対して実行される可能性があることにも注意してください。
トランザクションはネストできません。セッションにすでにアクティブなトランザクションがあるときにこのメソッドが呼び出されると、 InvalidTransactionOperation が発生します。
Mongo::Error から派生していない例外は、処理を停止し、トランザクションを中止し、with_transaction から伝播されます。 Mongo::Error から派生した例外は with_transaction によって処理され、 プロセスが再試行される可能性があります。
現在、with_transaction は、with_transaction の実行を開始してから少なくとも120秒が経過するまで、コミットを再試行し、呼び出しをブロックします。 このタイムアウトは設定できず、将来のドライバー バージョンで変更される可能性があります。
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 |
# ファイル 'lib/mongo/session.rb', 行 458 デフォルト with_transaction( = nil) @inide_with_transaction = true @with_transaction_timeout_ms = &.dig(:timeout_ms) || @options[:default_timeout_ms] || @client.timeout_ms @with_transaction_readline = accumulate_with_transaction_readline() # CSOTが有効になっている場合、カスタマーは期限を定義します。そうでない場合は、 # デフォルトのデッドラインである 120 秒に戻ります。 deadline = @with_transaction_readline || (Utils.MongoDB_time + 120) transaction_in_progress = false transaction_attempt = 0 last_error = nil overload_error_count = 0 overload_encountered = false ループ 行う 場合 transaction_attempt > 0 場合 overload_encountered 遅延 = @client.retry_ policies.バックオフ_遅延(overload_error_count) 場合 バックオフ_ウィザード_デッドライン?(deadline, 遅延) create_timeout_error_from(last_error, ' withTransaction で再試行するのを待機している間に CSO タイムアウトが期限切れになりました ') end 発生(last_error) ただし、 @client.retry_ policies.Should_retry_overload?(overload_error_count, 遅延) 休止(遅延) else バックオフ = backup_seconds_for_retry(transaction_attempt) 場合 バックオフ_ウィザード_デッドライン?(deadline, バックオフ) create_timeout_error_from(last_error, ' withTransaction で再試行するのを待機している間に CSO タイムアウトが期限切れになりました ') end 休止(バックオフ) end end = {} [:write_concern] = [:write_concern] 場合 start_transaction() transaction_in_progress = true transaction_attempt += 1 begin rv = ノードの数 自己 ヘルプ 例外 => e 場合 Within(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGESS_STATE) log_警告(「 $ { e . クラス } : #{ e } によりトランザクションを中止し ます 」) COT: 期限がすでに期限切れになっている場合は、それをクリアして次のようにします # abort_transaction は新しいタイムアウト(期限切れではない)を使用します。 # 期限がまだ期限切れになっていない場合は、終了しないようにして、残りの時間を使用して中止します。 @with_transaction_readline = nil 場合 @with_transaction_readline & & deadline_expired?(deadline) abort_transaction transaction_in_progress = false end 場合 deadline_expired?(deadline) transaction_in_progress = false create_timeout_error_from(e, 「withTransactionコールバック中に CSO タイムアウトが期限切れになりました」) end 場合 e.is_a?(mongo::エラー) & & e.ラベル('TransientTransactionError') last_error = e 場合 e.ラベル('SystemOverloadedError') overload_encountered = true overload_error_count += 1 elsif overload_encountered overload_error_count += 1 end 次へ end 発生 else 場合 Within(TRANSACTION_ABORTED_STATE, NO_TRANSACTION_STATE, TRACTION_COMMITED_STATE) transaction_in_progress = false return rv end COT: コミットする前にタイムアウトが経過した場合は、 を中止します 代わりに # トランザクションを実行し、クライアント側のタイムアウト エラーを発生させます。 場合 @with_transaction_readline & & deadline_expired?(deadline) transaction_in_progress = false @with_transaction_readline = nil abort_transaction 発生 mongo::エラー::TimeoutError, 'トランザクションがコミットされる前に COT タイムアウトの期限が切れました' end begin commit_transaction() transaction_in_progress = false return rv ヘルプ mongo::エラー => e 場合 e.ラベル(「 UnknownTransactionCommitResult 」) 場合 deadline_expired?(deadline) || (e.is_a?(エラー::OperationFailure::ファミリー) & & e.max_time_ms_expired?) transaction_in_progress = false 発生 ただし、 @with_transaction_timeout_ms & & deadline_expired?(deadline) create_timeout_error_from(e, ' withTransaction コミット中に COT タイムアウトが期限切れになりました ') end 場合 e.ラベル('SystemOverloadedError') overload_encountered = true overload_error_count += 1 elsif overload_encountered overload_error_count += 1 end 場合 overload_encountered 遅延 = @client.retry_ policies.バックオフ_遅延(overload_error_count) 場合 バックオフ_ウィザード_デッドライン?(deadline, 遅延) transaction_in_progress = false create_timeout_error_from(e, ' withTransaction コミット中に COT タイムアウトが期限切れになりました ') end ただし、 @client.retry_ policies.Should_retry_overload?(overload_error_count, 遅延) transaction_in_progress = false 発生 end 休止(遅延) end = ケース v = [:write_concern] 次の場合: WriteConcern::Base v. 次の場合: nil {} else v end [:write_concern] = .merge(w: :majority) RETRY elsif e.ラベル('TransientTransactionError') 場合 Utils.MongoDB_time >= deadline transaction_in_progress = false create_timeout_error_from(e, ' withTransaction コミット中に COT タイムアウトが期限切れになりました ') end last_error = e 場合 e.ラベル('SystemOverloadedError') overload_encountered = true overload_error_count += 1 elsif overload_encountered overload_error_count += 1 end @ State = NO_TRANSACTION_STATE 次へ else transaction_in_progress = false 発生 end ヘルプ エラー::AuthError transaction_in_progress = false 発生 end end end #正規の戻り値ではありませんが、true を返すため、対話型では 成功したことを示す メソッドを使用します。 true 保証する 場合 transaction_in_progress log_警告(' with_transaction コールバックで with_transaction ループが発生し、トランザクションが中止されました') begin abort_transaction ヘルプ エラー::OperationFailure::ファミリー, エラー::InvalidTransactionOperation end end @with_transaction_readline = nil @with_transaction_timeout_ms = nil @inide_with_transaction = false end |