クラス: 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 つのスレッドまたはプロセスからのセッションのみを使用できます。

何らかの方法で関連するアプリケーションによって実行される一連の連続操作を表す論理セッション。

以来

  • 2.5.0

名前空間で定義済み

クラス: ServerSession, SessionPool

定数の概要の削減

MISMATCHED_CLUSTER_ERROR_MSG =

現在使用されているクライアントとは異なるクラスターを持つクライアントからセッションが取得されたことを示すエラーメッセージ。

以来

  • 2.5.0

このセッションを作成するために使用されるクライアントの構成は、次と一致しません +
この操作を所有するクライアントのこのセッションは、その親である を介した操作にのみ使用してください +
'クライアント。'
SESSION_ENDED_ERROR_MSG =

セッションはすでに終了しているため、使用できないことを説明するエラー メッセージ。

以来

  • 2.5.0

'このセッションは終了したため、使用できません。新しい作成してください。'
SESSIONS_NOT_SUPportED =
非推奨。

セッションがサーバー バージョンでサポートされていないことを説明するエラー メッセージ。

以来

  • 2.5.0

'セッションは接続されたサーバーではサポートされていません。'
NO_TRANSACTION_STATE =

最後の操作がどのトランザクションにも関連していないか、操作がまだ発生していないセッションの状態を指します。

以来

  • 2.6.0

:no_transaction
STARTING_TRANSACTION_STATE =

ユーザーによってトランザクションが開始されたが、トランザクション内の操作はまだ発生していないセッションの状態です。

以来

  • 2.6.0

:starting_transaction
TRANSACTION_IN_PROGESS_STATE =

トランザクションが開始され、少なくとも 1 つの操作が発生しているが、トランザクションがまだコミットまたは中止されていないセッションの状態を指します。

以来

  • 2.6.0

:transaction_in_progress
TRACTION_COMMITED_STATE =

最後に実行された操作がトランザクションでコミットされたセッションの状態を指します。

以来

  • 2.6.0

:transaction_commited
TRANSACTION_aborted_STATE =

最後に操作が実行されたセッションの状態は、トランザクションが中止されました。

以来

  • 2.6.0

:transaction_aborted
UNILED_WRITE_CONCERN_CODES =

この定数は、プライベート API の一部です。 この定数は将来削除または変更される可能性があるため、可能な限り使用しないでください。

以来

  • 2.5.0

[
  79,  #UnknownReplWriteConcern
  100, #CancelsifyWriteConcern、
].freeze

Loggableに含まれる定数

ログ可能::PRFIX

インスタンス属性の概要を折りたたむ

ClusterTime::Consumerに含まれる属性

#cluster_time

インスタンス メソッドの概要を折りたたむ

ClusterTime::Consumerに含まれるメソッド

#advanced_cluster_time

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 を使用してセッションを開始する必要があります。 このコンストラクターは、ドライバー内部でのみ使用します。

セッションを初期化します。

セッションは明示的または暗黙的に実行できます。明示的なセッションの有効期間はアプリケーションによって管理されます。アプリケーションはこのようなセッションを明示的に作成し、明示的に終了します。暗黙的なセッションはドライバーによって自動的に作成され、その有効期間はドライバーによってマネージドされます。

暗黙的なセッションが作成される場合、そのセッションに関連付けられたサーバー セッションを持つことはできません。 このセッションを使用する操作が実際に実行されると、サーバー セッションはセッション プールからチェックアウトされます。 明示的なセッションが作成される場合は、すでに割り当てられているサーバー セッションを参照する必要があります。

パラメーター:

  • server_session ServerSession | nil

    このセッションが関連付けられているサーバー セッション。 :暗黙的な オプションが true の場合、これは nil である必要があります。

  • クライアント クライアント

    このセッションが作成されるクライアント。

  • options ハッシュ (デフォルトは{}です)

    このセッションのオプション。

オプション ハッシュ( options ):

  • :causal_consistency true|false

    このセッションで因果整合性を有効にするかどうか。

  • :default_timeout_ms 整数

    セッションで実行される次の操作の timeoutMS 値。

    • commitTransaction
    • abortTransaction
    • withTransaction
    • endSession
  • :default_transaction_options ハッシュ

    デフォルトで start_transaction に渡すオプションには、 start_transaction が受け入れるオプションのいずれかを含めることができます。

  • :implicit true|false

    内部ドライバーのみで使用します - セッションが暗黙的かどうかを指定します。 これが true の場合、 server_session は nil になります。 これは、接続がチェックアウトされた後にのみサーバー セッションがチェックアウトされるようにするものです。

  • :read_preference ハッシュ

    読み込み設定(read preference)オプションは、次の任意キーを持つ ハッシュとなります。

    • :モード-- string またはシンボルとしての読み込み設定 (read preference) )有効な値は、プライマリプライマリ_優先順位セカンダリセカンダリ_優先順位最も近い値です。
  • :snapshot true | false

    スナップショット読み取り用にセッションを設定します。

以来

  • 2.5.0



80
81
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
# ファイル 'lib/mongo/session.rb', 行 80

デフォルト 初期化(server_session, クライアント, options = {})
  場合 options[:causal_consistency] & & options[:snapshot]
    発生 ArgumentError, :causal_consistency と :snapshot の 両方 の オプションは、セッションで両方に設定することはできません
  end

  場合 options[:implicit]
    ただし、 server_session.nil?
      発生 ArgumentError, 暗黙的 な セッションは構築中にサーバー セッションを参照できません
    end
  elsif server_session.nil?
    発生 ArgumentError, '明示的なセッションは構築中にサーバー セッションを参照する必要があります'
  end

  @server_session = server_session
  options = options.dup

  暗黙的なセッションでは、クラスターとクライアントのオプションのみが必要です(絶対に実行されない
  トランザクション)、そのため、Mongo::クライアントのクローン作成を避けてください。
  # メモリ リーク: 代わりに元のクライアントを直接使用します。
  @client = options[:implicit] ? クライアント : クライアント.使用(:admin)
  @cluster = @client.クラスター
  @options = options.dup.freeze
  @cluster_time = nil
  @ State = NO_TRANSACTION_STATE
  @with_transaction_readline = nil
  @with_transaction_timeout_ms = nil
  @inide_with_transaction = false
end

インスタンス属性の詳細

#クライアント=クライアント(読み取り専用)

このセッションが作成されたクライアントを返します。

次の値を返します。

  • クライアント

    このセッションが作成されたクライアント。

以来

  • 2.5.1



117
118
119
# ファイル 'lib/mongo/session.rb', 行 117

デフォルト クライアント
  @client
end

#クラスター=オブジェクト(読み取り専用)

以来

  • 2.5.0



119
120
121
# ファイル 'lib/mongo/session.rb', 行 119

デフォルト クラスター
  @cluster
end

# operation_time = BSON::Timestamp (readonly)

このセッションの最新のoptimeを返します。

次の値を返します。

  • BSON::Timestamp

    このセッションの最新のoptime 。

以来

  • 2.5.0



130
131
132
# ファイル 'lib/mongo/session.rb', 行 130

デフォルト operation_time
  @operation_time
end

オプション=ハッシュ(読み取り専用)

このセッションの オプションを返します。

次の値を返します。

  • ハッシュ

    このセッションのオプション。

以来

  • 2.5.0



112
113
114
# ファイル 'lib/mongo/session.rb', 行 112

デフォルト options
  @options
end

#ピン留め_接続_グローバル_id =整数 | 整数 | nil (読み取り専用)

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

このセッションが固定されている場合は、接続グローバル ID を返します。

次の値を返します。

  • (Integer | nil)

    このセッションが固定されている接続グローバル ID(存在する場合)。

以来

  • 2.5.0



281
282
283
# ファイル 'lib/mongo/session.rb', 行 281

デフォルト ピン留め_接続_グローバル_id
  @finned_ connection_ global_id
end

#ピン留め_サーバー =サーバー| nil (読み取り専用)

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

このセッションが固定されているサーバー(mongos である必要がある場合)を返します。

次の値を返します。

  • (Server | nil)

    このセッションが固定されているサーバー( mongos である必要がある場合)。

以来

  • 2.5.0



275
276
277
# ファイル 'lib/mongo/session.rb', 行 275

デフォルト completed_server
  @finned_server
end

#recovery_tokenBSON::Document | nil

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

このセッションで実行されているシャーディングされたトランザクションのリカバリ トークン(存在する場合)を返します。

次の値を返します。

  • (BSON::Document | nil)

    このセッションで実行されているシャーディングされたトランザクションのリカバリ トークン(存在する場合)。

以来

  • 2.5.0



287
288
289
# ファイル 'lib/mongo/session.rb', 行 287

デフォルト リカバリ_トークン
  @recury_token
end

# snapshot_timestamp =オブジェクト

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

以来

  • 2.5.0



1270
1271
1272
# ファイル 'lib/mongo/session.rb', 行 1270

デフォルト snapshot_timestamp
  @snapshot_timestamp
end

# with_transaction_readline整数 | nil (読み取り専用)

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

現在のトランザクションの期限(存在する場合)を返します。

次の値を返します。

  • (Integer | nil)

    現在のトランザクションの期限(存在する場合)。

以来

  • 2.5.0



1274
1275
1276
# ファイル 'lib/mongo/session.rb', 行 1274

デフォルト with_transaction_readline
  @with_transaction_readline
end

インスタンス メソッドの詳細

abort_transaction (options = nil) = オブジェクト

データベースに変更を加えずに、現在アクティブなトランザクションを中止します。

例:

トランザクションを中止します。

session.abort_transaction

パラメーター:

  • options ハッシュ (デフォルトはnil

    カスタマイズ可能なオプションのセット

オプション ハッシュ( options ):

  • :timeout_ms 整数

    操作のタイムアウト(ミリ秒単位)。 負でない整数である必要があります。 0 の明示的な値は無限を意味します。 デフォルト値が設定されていない場合、値はクライアントから継承されることを意味します。

次の値が発生します。

以来

  • 2.6.0



803
804
805
806
807
808
809
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
# ファイル 'lib/mongo/session.rb', 行 803

デフォルト abort_transaction(options = 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

  options ||= {}

  begin
    ただし、 start_transaction?
      @aboring_transaction = true
      context = 操作::Context.新着情報(
        クライアント: @client,
        セッション: 自己,
        operation_timeouts: operation_timeouts(options)
      )
      write_with_retry(txn_options[: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 の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

セッションが現在トランザクションを中止しているかどうかを返します。

次の値を返します。

  • true | false

    セッションが現在トランザクションを中止しているかどうか。

以来

  • 2.5.0



899
900
901
# ファイル 'lib/mongo/session.rb', 行 899

デフォルト aborting_transaction
  !!@aboring_transaction
end

#add_ autocommit (コマンド) =ハッシュBSON::Document

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

該当する場合は、コマンド ドキュメントにオートコミット フィールドを追加します。

例:

session.add_autocommit!(cmd)

次の値を返します。

  • ハッシュBSON ::Document

    コマンド ドキュメント。

以来

  • 2.6.0



985
986
987
988
989
# ファイル 'lib/mongo/session.rb', 行 985

デフォルト Add_Autocommit.(コマンド)
  コマンド.タップ 行う |c|
    c[: 自動コミット] = false 場合 in_transaction?
  end
end

Add_start_transaction。 (コマンド) =ハッシュBSON::Document

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

該当する場合は、 コマンド ドキュメントに startTransaction フィールドを追加します。

例:

session.add_start_transaction!(cmd)

次の値を返します。

  • ハッシュBSON ::Document

    コマンド ドキュメント。

以来

  • 2.6.0



1000
1001
1002
1003
1004
# ファイル 'lib/mongo/session.rb', 行 1000

デフォルト add_start_transaction.(コマンド)
  コマンド.タップ 行う |c|
    c[:startTransaction] = true 場合 start_transaction?
  end
end

#add_txn_num (コマンド) =ハッシュBSON::Document

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

該当する場合は、コマンド ドキュメントにトランザクション番号を追加します。

例:

session.add_txn_num!(cmd)

次の値を返します。

  • ハッシュBSON ::Document

    コマンド ドキュメント。

以来

  • 2.6.0



1015
1016
1017
1018
1019
# ファイル 'lib/mongo/session.rb', 行 1015

デフォルト add_txn_num!(コマンド)
  コマンド.タップ 行う |c|
    c[:txnNumber] = BSON::Int64.新着情報(@server_session.txn_num) 場合 in_transaction?
  end
end

# add_txn_opts! を使用します。 (コマンド、_read、コンテキスト)⇒ HashBSON::ドキュメント

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

該当する場合は、トランザクション オプションを追加します。

例:

session.add_txn_opts!(cmd)

次の値を返します。

  • ハッシュBSON ::Document

    コマンド ドキュメント。

以来

  • 2.6.0



1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
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
# ファイル 'lib/mongo/session.rb', 行 1030

デフォルト 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 = txn_options[: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を進める。

例:

optimeを進める。

session.advance_operation_time(timestamp)

パラメーター:

  • new_operation_time BSON::Timestamp

    新しいoptime 。

次の値を返します。

  • BSON::Timestamp

    現在の時間と新しい時間を考慮した最大optime 。

以来

  • 2.5.0



1209
1210
1211
1212
1213
1214
1215
# ファイル 'lib/mongo/session.rb', 行 1209

デフォルト advanced_operation_time(new_operation_time)
  @operation_time = 場合 @operation_time
                      [ @operation_time, new_operation_time ].最大
                    else
                      new_operation_time
                    end
end

# commit_transaction (options = nil) =オブジェクト

セッションで現在アクティブなトランザクションをコミットします。

例:

トランザクションをコミットします。

session.commit_transaction

パラメーター:

  • options ハッシュ (デフォルトはnil

    カスタマイズ可能なオプションのセット

オプション ハッシュ( options ):

  • :write_concern nil | WriteConcern ::Base

    この操作に使用する書込み保証 (write concern) です。

  • :timeout_ms 整数

    操作のタイムアウト(ミリ秒単位)。 負でない整数である必要があります。 0 の明示的な値は無限を意味します。 デフォルト値が設定されていない場合、値はクライアントから継承されることを意味します。

次の値が発生します。

以来

  • 2.6.0



717
718
719
720
721
722
723
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
# ファイル 'lib/mongo/session.rb', 行 717

デフォルト commit_transaction(options = nil)
  クエリ キャッシュ.クリア
  checkpoint_if_endd.
  checkpoint_if_no_transaction.

  場合 Within(TRANSACTION_ABORTED_STATE)
    発生 mongo::エラー::InvalidTransactionOperation.新着情報(
      mongo::エラー::InvalidTransactionOperation.canド_back_ after_msg(
        :abortTransaction, :commitTransaction
      )
    )
  end

  options ||= {}

  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 = options[:write_concern] || txn_options[:write_concern]
      write_concern = WriteConcern.得る(write_concern) 場合 write_concern & & !write_concern.is_a?(WriteConcern::Base)

      context = 操作::Context.新着情報(
        クライアント: @client,
        セッション: 自己,
        operation_timeouts: operation_timeouts(options)
      )
      write_with_retry(write_concern, termination_transaction: true,
                                      context: context) 行う |接続, txn_num, context|
        場合 context.再試行しますか? & & !context.overload_only_retry?
          場合 write_concern
            wco = write_concern.options.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 の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

セッションが現在トランザクションをコミットしているかどうかを返します。

次の値を返します。

  • true | false

    セッションが現在トランザクションをコミットしているかどうか。

以来

  • 2.5.0



891
892
893
# ファイル 'lib/mongo/session.rb', 行 891

デフォルト commit_transaction?
  !!@commiting_transaction
end

# ダーティ 。 (マーク = true) = オブジェクト

基礎となるサーバーセッションの指定された値にダーティ状態を設定します。 サーバーセッションがない場合、これは何も行いません。

パラメーター:

  • マーク true | false (デフォルトはtrue

    サーバーセッションをダーティとしてマークするかどうか。

以来

  • 2.5.0



139
140
141
# ファイル 'lib/mongo/session.rb', 行 139

デフォルト dirty!(マーク = true)
  @server_session&.dirty!(マーク)
end

# ダーティー= true | false | nil

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

基礎となるサーバーセッションがダーティであるかどうかを返します。 このセッションのサーバーセッションが存在しない場合、 は nil を返します。

次の値を返します。

  • true | false | nil

    基礎となるサーバーセッションがダーティであるかどうか。 このセッションのサーバーセッションが存在しない場合、 は nil を返します。

以来

  • 2.5.0



147
148
149
# ファイル 'lib/mongo/session.rb', 行 147

デフォルト dirty?
  @server_session&.dirty?
end

#end_sessionnil

このセッションを終了します。

このセッションで進行中のトランザクションがある場合、そのトランザクションは中止されます。 このセッションに関連付けられたサーバー セッションは、サーバー セッション プールに返されます。 最後に、このセッションは終了としてマークされ、使用できなくなります。

このセッションがすでに終了している場合、このメソッドは何も行いません。

このメソッドでは、名前から提案される内容とは異なり、このサーバーに endSessions コマンドを直接発行しないことに注意してください。

例:

session.end_session

次の値を返します。

  • (nil)

    常に nil です。

以来

  • 2.5.0



374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
# ファイル 'lib/mongo/session.rb', 行 374

デフォルト 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

#は終了しましたか? = truefalse

このセッションが終了したかどうか。

例:

session.ended?

次の値を返します。

  • truefalse

    セッションが終了したかどうか。

以来

  • 2.5.0



244
245
246
# ファイル 'lib/mongo/session.rb', 行 244

デフォルト 終了しました
  !!@end
end

明示的かどうか = truefalse

このセッションは明示的なもの(つまり ユーザーが作成した)。

例:

セッションは明示的か?

session.explicit?

次の値を返します。

  • truefalse

    このセッションが明示的であるかどうか。

以来

  • 2.5.2



179
180
181
# ファイル 'lib/mongo/session.rb', 行 179

デフォルト explicit?
  !implicit?
end

暗黙的な ではありませんか。 = truefalse

このセッションは暗黙的なセッション(ユーザーが作成したものではない)。

例:

セッションは暗黙的か?

session.implicit?

次の値を返します。

  • truefalse

    このセッションが暗黙的かどうか。

以来

  • 2.5.1



167
168
169
# ファイル 'lib/mongo/session.rb', 行 167

デフォルト implicit?
  @implicit ||= !!(@options.key?(:implicit) & & @options[:implicit] == true)
end

in_transaction は をサポートしていますか。 = true | false

セッションが現在トランザクション内であるかどうか。

例:

セッションはトランザクション内かどうか

session.in_transaction?

次の値を返します。

  • true | false

    セッションがトランザクションに含まれているかどうか。

以来

  • 2.6.0



883
884
885
# ファイル 'lib/mongo/session.rb', 行 883

デフォルト in_transaction?
  Within(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGESS_STATE)
end

#inside_with_transaction?Boolean

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

現在 with_transaction ブロック内にあるかどうかを返します。

次の値を返します。

  • ブール値

    現在 with_transaction ブロック内にあるかどうか。

以来

  • 2.5.0



1278
1279
1280
# ファイル 'lib/mongo/session.rb', 行 1278

デフォルト Within_with_transaction
  @inide_with_transaction
end

詳しくは、 を 検査しstring ます

検査で使用するための書式設定された string を取得します。

例:

セッション オブジェクトを調べます。

session.inspect

次の値を返します。

  • ( string )

    セッション検査。

以来

  • 2.5.0



352
353
354
# ファイル 'lib/mongo/session.rb', 行 352

デフォルト 検査する
  " #< Mongo::Session: 0 x #{ object_id } session_id= #{ session_id } options= #{ @options } > "
end

Atlas の サンプル データ セット からの映画 データを含むコレクションを使用します 。

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

まだ設定されていない場合は、セッション プールからセッションをチェックアウトして、セッション オブジェクトの server_session を入力します。

次の値を返します。

次の値が発生します。

以来

  • 2.5.0



1223
1224
1225
1226
1227
1228
1229
1230
1231
# ファイル 'lib/mongo/session.rb', 行 1223

デフォルト マテリアライズドの場合
  発生 エラー::SessionEned 場合 終了しました

  return ただし、 implicit? & & !@server_session

  @server_session = クラスター.session_pool.チェックアウト

  自己
end

#マテリアライズド? =ブール値

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

次の値を返します。

  • ブール値

次の値が発生します。

以来

  • 2.5.0



1234
1235
1236
1237
1238
# ファイル 'lib/mongo/session.rb', 行 1234

デフォルト マテリアライズド?
  発生 エラー::SessionEned 場合 終了しました

  !@server_session.nil?
end

# next_txn_num =整数

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

インクリメントして次のトランザクション番号を返します。

例:

次のトランザクション番号を取得します。

session.next_txn_num

次の値を返します。

  • (整数)

    次のトランザクション番号。

次の値が発生します。

以来

  • 2.5.0



1249
1250
1251
1252
1253
# ファイル 'lib/mongo/session.rb', 行 1249

デフォルト next_txn_num
  発生 エラー::SessionEned 場合 終了しました

  @server_session.next_txn_num
end

# point_to_ connection ( connection_ global_id, connection: nil) = オブジェクト

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

このセッションを指定された接続に固定します。

このセッションは になります。

パラメーター:

  • connection_ global_id (整数)

    固定する接続のグローバル ID

  • 接続 接続 | nil (デフォルトはnil

    固定する接続オブジェクト。

次の値が発生します。

  • (ArgumentError)

以来

  • 2.5.0



925
926
927
928
929
930
# ファイル 'lib/mongo/session.rb', 行 925

デフォルト 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 である必要がある)に固定します。

パラメーター:

  • サーバー サーバー

    このセッションを固定するサーバー。

次の値が発生します。

  • (ArgumentError)

以来

  • 2.5.0



908
909
910
911
912
913
914
915
916
# ファイル 'lib/mongo/session.rb', 行 908

デフォルト point_to_server(サーバー)
  発生 ArgumentError, ' nil サーバーにピン留めできません' 場合 サーバー.nil?

  場合 Lint.有効か & & !サーバー.mongos?
    発生 エラー::LintError, 「 セッションを mongos ではない サーバー #{ server . Summary } に固定しようとしました 。
  end

  @finned_server = サーバー
end

プロセス(結果) = プロセス::結果

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

このセッションを使用したサーバーからの応答を処理します。

例:

サーバーからの応答を処理します。

session.process(result)

パラメーター:

次の値を返します。

以来

  • 2.5.0



1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
# ファイル 'lib/mongo/session.rb', 行 1183

デフォルト プロセス(結果)
  ただし、 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に設定できます。

次の値を返します。

  • ブール値

以来

  • 2.5.0



199
200
201
# ファイル 'lib/mongo/session.rb', 行 199

デフォルト retry_reads?
  クライアント.options[:retry_reads] != false
end

retry_writes? = truefalse

注:

再試行可能な書き込みは、クラスター、レプリカセット、または負荷分散されたトポロジーでのみ使用できます。

このセッションで実行された書き込みが再試行されます。

例:

書き込みが再試行されます。

session.retry_writes?

次の値を返します。

  • truefalse

    書込みが再試行される場合。

以来

  • 2.5.0



214
215
216
# ファイル 'lib/mongo/session.rb', 行 214

デフォルト retry_writes?
  !!クライアント.options[:retry_writes] & & (クラスター.replica_set? || クラスター.シャーディングされたかどうか || クラスター.load_Balanced?)
end

#revert_to_starting_transaction!オブジェクト

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

セッション状態を STARTING_TRANSACTION_STATE に戻します。トランザクション の最初のコマンドを再試行する前に呼び出され、 startTransaction: true が再試行時に保持されます。

以来

  • 2.5.0



1134
1135
1136
1137
1138
# ファイル 'lib/mongo/session.rb', 行 1134

デフォルト return_to_starting_transaction.
  return ただし、 Within(TRANSACTION_IN_PROGESS_STATE)

  @ State = STARTING_TRANSACTION_STATE
end

#session_idBSON::Document

セッションが終了されていない場合は、このセッションのサーバー セッション ID を取得します。 セッションが終了した場合、 は Error::SessionEned を発生させます。

次の値を返します。

  • BSON::Document

    サーバー セッション ID

次の値が発生します。

以来

  • 2.5.0



256
257
258
259
260
261
262
263
264
265
266
267
268
269
# ファイル 'lib/mongo/session.rb', 行 256

デフォルト Session_id
  発生 エラー::SessionEned 場合 終了しました

  #明示的なセッションには常にsession_idが付与されます。これは実行中であるためです。
  サーバー セッションの構築を提供する必要があります。 暗黙的なセッション
  は具体化されるまでセッション_idを持たないため、 は
  #session_id は失敗する可能性があります。 アプリケーションに機会があってはなりません
  暗黙的なセッションは次ではないとして、この失敗が発生します:
  アプリケーションがアクセスできるのは、アプリケーションの有効期間が次のように制限されているためです。
  これはドライバーによって完全に実行されます。
  発生 エラー::SessionNot マテリアライズド ただし、 マテリアライズド?

  @server_session.Session_id
end

#スナップショット = true | false

セッションがスナップショット読み取り用に構成されているかどうかを返します。

次の値を返します。

  • true | false

    セッションがスナップショット読み取り用に構成されているかどうか。

以来

  • 2.5.0



123
124
125
# ファイル 'lib/mongo/session.rb', 行 123

デフォルト スナップショット
  !!options[:snapshot]
end

# start_transaction (options = nil) =オブジェクト

このセッションの後続の操作を新しいトランザクションに配置します。

start_transaction が呼び出された後に操作が実行されるまで、サーバー上でトランザクションは開始されないことに注意してください。

例:

新しいトランザクションを開始する

session.start_transaction(options)

パラメーター:

  • options ハッシュ (デフォルトはnil

    開始されるトランザクションのオプション。

オプション ハッシュ( options ):

  • :max_commit_time_ms 整数

    1 つの commitTransaction コマンドの実行を許可する最大時間(ミリ秒単位)です。このオプションは非推奨です。代わりに :timeout_ms を使用してください。

  • :read_concern ハッシュ

    読み取り保証 (read concern) オプション ハッシュと、次の任意キーが含まれます。

    • :level -- 記号としての読み込み設定(読み込み設定 (read preference) )レベル。有効な値は、:local:過半数:スナップショット です。
  • :write_concern ハッシュ

    書込み保証(write concern) オプション。 :w => Integer|String、 :fsync => ブール値、 :j => ブール値 にすることができます。

  • :read ハッシュ

    読み込み設定(read preference)オプション。 ハッシュには以下の項目が含まれる場合があります。

    • :モード-- シンボルとして指定された読み込み設定 (read preference) )有効な値はプライマリのみです。
  • :timeout_ms 整数

    操作のタイムアウト(ミリ秒単位)。 負でない整数である必要があります。 0 の明示的な値は無限を意味します。 デフォルト値が設定されていない場合、値はクライアントから継承されることを意味します。

次の値が発生します。

  • Error::InvalidTransactionOperation

    トランザクションがすでに進行中である場合、または書込み保証 (write concern)が未確認の場合。

以来

  • 2.6.0



653
654
655
656
657
658
659
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
# ファイル 'lib/mongo/session.rb', 行 653

デフォルト start_transaction(options = nil)
  checkpoint_transactions_supported.

  場合 options
    Lint.validate_read_concern_option(options[: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(options || {})

  場合 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 の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

次の値を返します。

  • ブール値

以来

  • 2.5.0



871
872
873
# ファイル 'lib/mongo/session.rb', 行 871

デフォルト start_transaction?
  Within(STARTING_TRANSACTION_STATE)
end

次を使用して、_read_write_concernを使用します。 (コマンド) =ハッシュBSON::Document

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

該当しない場合は、コマンドから読み取り保証や書込み保証を削除します。

例:

session.suppress_read_write_concern!(cmd)

次の値を返します。

  • ハッシュBSON ::Document

    コマンド ドキュメント。

以来

  • 2.6.0



1098
1099
1100
1101
1102
1103
1104
1105
# ファイル 'lib/mongo/session.rb', 行 1098

デフォルト sink_read_write_concern を使用します。(コマンド)
  コマンド.タップ 行う |c|
    次へ ただし、 in_transaction?

    c.削除(:readConcern) ただし、 start_transaction?
    c.削除(:writeConcern) ただし、 c[:commitTransaction] || c[:abortTransaction]
  end
end

#txn_numInteger

現在のトランザクション番号を取得します。

例:

現在のトランザクション番号を取得します。

session.txn_num

次の値を返します。

  • (整数)

    現在のトランザクション番号。

次の値が発生します。

以来

  • 2.6.0



1263
1264
1265
1266
1267
# ファイル 'lib/mongo/session.rb', 行 1263

デフォルト txn_num
  発生 エラー::SessionEned 場合 終了しました

  @server_session.txn_num
end

#txn_optionsHash

このセッションでは。

次の値を返します。

  • ハッシュ

    現在実行中のトランザクションのオプション

以来

  • 2.6.0



155
156
157
# ファイル 'lib/mongo/session.rb', 行 155

デフォルト txn_options
  @txn_options or 発生 ArgumentError, アクティブなトランザクションがありません
end

# txn_read_preference =ハッシュ

現在アクティブなトランザクションでセッションが使用する読み込み設定 (read preference) を取得します。

これはアンダースコア キーを持つドライバー スタイルのハッシュです。

例:

トランザクションの読み込み設定 (read preference)を取得する

session.txn_read_preference

次の値を返します。

  • ハッシュ

    トランザクションの読み込み設定(read preference)。

以来

  • 2.6.0



229
230
231
232
233
234
# ファイル 'lib/mongo/session.rb', 行 229

デフォルト txn_read_preference
  rp = txn_options[:read] ||
       @client.read_preference
  mongo::Lint.validate_userscore_read_preference(rp)
  rp
end

#解除(接続 = nil) =オブジェクト

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

セッションが固定されている場合は、固定されたサーバーまたは接続からこのセッションの固定を解除します。

パラメーター:

  • 接続 接続 | nil (デフォルトはnil

    接続の固定を解除します。

以来

  • 2.5.0



938
939
940
941
942
943
944
945
946
947
948
949
950
951
# ファイル 'lib/mongo/session.rb', 行 938

デフォルト unpin(接続 = 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 の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

セッションが固定され、指定された例外インスタンスとセッションのトランザクション状態で固定を解除する必要がある場合は、このセッションを固定されたサーバーまたは接続から固定を解除します。

例外インスタンスには、すでにすべてのラベルが設定されている必要があります(クライアントとサーバー側で生成されたラベルの両方)。

パラメーター:

  • エラー エラー

    処理する例外インスタンス。

  • 接続 接続 | nil (デフォルトはnil

    接続の固定を解除します。

以来

  • 2.5.0



964
965
966
967
968
969
970
971
972
973
974
# ファイル 'lib/mongo/session.rb', 行 964

デフォルト unping_maybe(エラー, 接続 = nil)
  場合 !Within(セッション::NO_TRANSACTION_STATE) & &
     エラー.ラベル('TransientTransactionError')
    unpin(接続)
  end

  場合 commit_transaction? & &
     エラー.ラベル( UnknownTransactionCommitResult )
    unpin(接続)
  end
end

#update_state!Object

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

(コミット以外と中止以外の)操作が実行されているため、セッションの状態を更新します。

以来

  • 2.6.0



1144
1145
1146
1147
1148
1149
1150
1151
# ファイル 'lib/mongo/session.rb', 行 1144

デフォルト 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 の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

指定されたクライアントが使用するセッションを検証します。

セッションは終了してはならず、セッションが使用されるクライアントと同じクラスターを持つクライアントによって作成された必要があります。

パラメーター:

  • クライアント クライアント

    セッションが使用されるクライアント。

次の値を返します。

次の値が発生します。

以来

  • 2.5.0



1166
1167
1168
1169
1170
# ファイル 'lib/mongo/session.rb', 行 1166

デフォルト validate!(クライアント)
  checkpoint_if_endd.
  checkpoint_matching_cluster.(クライアント)
  自己
end

# validate_read_preference (コマンド) =オブジェクト

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

コマンドの読み込み設定 (read preference)がプライマリであることを確認します。

例:

session.validate_read_preference!(command)

次の値が発生します。

以来

  • 2.6.0



1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
# ファイル 'lib/mongo/session.rb', 行 1117

デフォルト 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秒が経過するまで、コミットを再試行し、呼び出しをブロックします。 このタイムアウトは設定できず、将来のドライバー バージョンで変更される可能性があります。

例:

トランザクション内でのステートメントの実行

session.with_transaction(write_concern: {w: :majority}) do
  collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
                        session: session)

end

トランザクション内でステートメントを実行し、消費される合計時間を制限します

Timeout.timeout(5) do
  session.with_transaction(write_concern: {w: :majority}) do
    collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
                          session: session)

  end
end

パラメーター:

  • options ハッシュ (デフォルトはnil

    開始されるトランザクションのオプション。 これらは、 start_transaction が受け入れるオプションと同じオプションです。

次の値が発生します。

  • Error::InvalidTransactionOperation

    トランザクションがすでに進行中である場合、または書込み保証 (write concern)が未確認の場合。

以来

  • 2.7.0



447
448
449
450
451
452
453
454
455
456
457
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
# ファイル 'lib/mongo/session.rb', 行 447

デフォルト with_transaction(options = nil)
  @inide_with_transaction = true
  @with_transaction_timeout_ms = options&.dig(:timeout_ms) || @options[:default_timeout_ms] || @client.timeout_ms
  @with_transaction_readline = accumulate_with_transaction_readline(options)
  deadline = 場合 @with_transaction_readline
               COT が有効になっているため、カスタマー定義の期限があります。
               @with_transaction_readline
             else
               COT が有効になっていないため、デフォルトの期限である 120 秒が使用されます。
               Utils.MongoDB_time + 120
             end
  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

    commit_options = {}
    commit_options[:write_concern] = options[:write_concern] 場合 options
    start_transaction(options)
    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(commit_options)
        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

          wc_options = ケース v = commit_options[:write_concern]
                       次の場合: WriteConcern::Base
                         v.options
                       次の場合: nil
                         {}
                       else
                         v
                       end
          commit_options[:write_concern] = wc_options.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