클래스: Mongo::Session
- 상속:
-
객체
- 객체
- Mongo::Session
- 확장자:
- 전달 가능
- 다음을 포함합니다.
- ClusterTime::Consumer, Loggable, Retryable
- 다음에 정의됨:
- lib/ Mongo/session.rb,
lib/ Mongo/session/session_pool.rb,
lib/ Mongo/session/server_session.rb,
lib/ Mongo/session/server_session/dirtyable.rb
개요
세션 객체는 스레드로부터 안전하지 않습니다. 애플리케이션 은 한 번에 하나의 스레드 또는 프로세스 의 세션만 사용할 수 있습니다.
어떤 방식으로든 관련된 애플리케이션 에서 실행되는 설정하다 의 순차적 작업을 나타내는 논리적 세션입니다.
네임스페이스 아래에 정의됨
클래스: 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_PROGRESS_STATE =
트랜잭션 이 시작되었고 하나 이상의 작업이 발생했지만 트랜잭션 이 아직 커밋되거나 중단되지 않은 세션 상태 입니다.
:transaction_in_progress
- TRANSACTION_COMMITTED_STATE =
마지막으로 실행된 작업이 트랜잭션 커밋인 세션의 상태입니다.
:transaction_committed
- TRANSACTION_ABORTED_STATE =
마지막으로 실행된 작업이 트랜잭션 중단이었던 세션의 상태입니다.
:transaction_aborted
- UNLABELED_WRITE_CONCERN_CODES =
이 상수는 비공개 API의 일부입니다. 이 상수는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
[ 79, # UnknownReplWriteConcern 100, #CanCanSatisfyWriteConcern, ].동결
Loggable에서 포함된 상수
인스턴스 속성 요약 접기
-
#client ⇒ Client
읽기 전용
이 세션이 생성된 클라이언트 입니다.
-
#operation_time ⇒ BSON::Timestamp
읽기 전용
이 세션의 가장 최근에 본 optime 입니다.
-
옵션 #개 ⇒ 해시
읽기 전용
이 세션의 옵션입니다.
-
#pinned_connection_global_id ⇒ Integer | nil
읽기 전용
비공개
이 세션이 고정되는 연결 전역 ID(있는 경우)입니다.
-
#pinned_server ⇒ MongoDB 서버 | nil
읽기 전용
비공개
이 세션이 고정되는 서버 ( mongos)입니다(있는 경우).
-
#recovery_token ⇒ BSON::Document | nil
비공개
이 세션에서 실행 중인 샤드 트랜잭션에 대한 복구 토큰(있는 경우)입니다.
- #snapshot_timestamp ⇒ 객체 비공개
- #with_transaction_deadline ⇒ 객체 읽기 전용
ClusterTime::Consumer에 포함된 속성
인스턴스 메서드 요약 접기
-
#abort_transaction(options = nil) ⇒ 객체
데이터베이스 를 변경하지 않고 현재 활성 트랜잭션 을 중단합니다.
-
#aborting_transaction? ⇒ true | false
비공개
세션이 현재 트랜잭션 을 중단하고 있는지 여부입니다.
-
#add_autocommit!(명령) ⇒ 해시, BSON::Document
비공개
해당하는 경우 명령 문서에 자동 커밋 필드를 추가합니다.
-
#add_start_transaction!(명령) ⇒ 해시, BSON::Document
비공개
해당하는 경우 명령 문서에 startTransaction 필드를 추가합니다.
-
#add_txn_num!(명령) ⇒ 해시, BSON::Document
비공개
해당하는 경우 명령 문서에 트랜잭션 번호를 추가합니다.
-
#add_txn_opts!(명령, 읽기, 컨텍스트) ⇒ 해시, BSON::Document
비공개
해당하는 경우 트랜잭션 옵션을 추가합니다.
-
#advanced_operation_time(new_operation_time) ⇒ BSON::Timestamp
이 세션의 캐시된 optime을 앞당깁니다.
- #cluster ⇒ Object
-
#commit_transaction(options = nil) ⇒ 객체
세션에서 현재 활성 트랜잭션 을 커밋합니다.
-
#committing_transaction? ⇒ true | false
비공개
세션이 현재 트랜잭션 을 커밋하고 있는지 여부입니다.
-
#더티!(mark = true) ⇒ 객체
더티 상태 기본 서버 세션에 지정된 값으로 설정합니다.
-
#더티? ⇒ true | false | nil
비공개
기본 서버 세션이 더티인지 여부입니다.
-
#end_session ⇒ nil
이 세션을 종료합니다.
-
#종료되었나요? ⇒ 참, 거짓
이 세션이 종료되었는지 여부입니다.
-
#명시적? ⇒ 참, 거짓
이 세션이 명시적 세션입니까(예: 사용자 생성).
-
#암시적? ⇒ 참, 거짓
이 세션이 암시적 세션입니까(사용자가 생성하지 않음).
-
#in_transaction? ⇒ true | false
세션이 현재 트랜잭션 중인지 여부입니다.
-
#initialize(server_session, 클라이언트, options = {}) ⇒ Session
생성자
비공개
세션을 초기화합니다.
-
#검사 ⇒ string
검사에 사용할 형식이 지정된 string 을 가져옵니다.
-
#materialize_if_needed ⇒ 세션
비공개
아직 설정하다 되지 않은 경우 세션 풀에서 세션을 체크아웃하여 세션 객체의 server_session을 채웁니다.
- #구체화되었나요? ⇒ 부울 비공개
-
#Next_txn_num ⇒ 정수
비공개
다음 트랜잭션 번호를 증가시키고 반환합니다.
-
#pin_to_connection(connection_global_id) ⇒ 객체
비공개
이 세션을 지정된 연결에 고정합니다.
-
#pin_to_server(서버) ⇒ 객체
비공개
이 세션을 지정된 서버( mongos 여야 함)에 고정합니다.
-
#프로세스(결과) ⇒ Operation::Result
비공개
이 세션을 사용한 서버의 응답을 처리합니다.
-
#retry_reads? ⇒ 부울
비공개
최신 재시도 가능 읽기 사양에 따라 이 세션에서 실행된 읽기를 재시도할 수 있는지 여부입니다.
-
#retry_writes? ⇒ 참, 거짓
이 세션으로 실행된 쓰기가 재시도됩니다.
-
#session_id ⇒ BSON::Document
세션이 종료되지 않은 경우 이 세션의 서버 세션 ID를 가져옵니다.
-
스냅샷 #개? ⇒ true | false
세션이 스냅샷 읽기에 대해 구성되었는지 여부입니다.
-
#start_transaction(options = nil) ⇒ 객체
이 세션의 후속 작업을 새 트랜잭션 에 배치합니다.
- #startup_transaction? ⇒ 부울 비공개
-
#Suppress_read_write_concern!(명령) ⇒ 해시, BSON::Document
비공개
해당 사항이 없는 경우 명령에서 읽기 고려 및/또는 쓰기 고려를 제거합니다.
-
#txn_num ⇒ 정수
현재 트랜잭션 번호를 가져옵니다.
-
#txn_options ⇒ 해시
이 세션에서.
-
#txn_read_preference ⇒ 해시
세션이 현재 활성 트랜잭션 에서 사용할 읽기 설정 (read preference) 을 가져옵니다.
-
#unpin(connection = nil) ⇒ 객체
비공개
세션이 고정된 경우 고정된 서버 또는 연결에서 이 세션의 고정을 해제합니다.
-
#unpin_maybe(오류, 연결 = nil) ⇒ 객체
비공개
세션이 고정되었고 지정된 예외 인스턴스 및 세션의 트랜잭션 상태에 따라 고정을 해제해야 하는 경우 고정된 서버 또는 연결에서 이 세션의 고정을 해제합니다.
-
#update_state! ⇒ 객체
비공개
(비커밋 및 비중단) 작업 실행 으로 인한 세션 상태 를 업데이트합니다.
-
#유효성을 검사합니다!(클라이언트) ⇒ 세션
비공개
지정된 클라이언트 에서 사용할 세션의 유효성을 검사합니다.
-
#validate_read_preference!(명령) ⇒ 객체
비공개
명령의 읽기 기본 설정이 프라이머리인지 확인합니다.
-
#with_transaction(options = nil) ⇒ 객체
트랜잭션 에서 제공된 차단 을 실행하고 필요에 따라 다시 시도합니다.
ClusterTime::Consumer에 포함된 메서드
Loggable에 포함된 메서드
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Retryable에 포함된 메서드
#read_Worker, #select_server, #write_Worker
생성자 세부 정보
#initialize(server_session, client, options = {}) ⇒ Session
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
애플리케이션은 Client#start_session을 사용하여 세션을 시작해야 합니다. 이 생성자는 내부 운전자 전용입니다.
세션을 초기화합니다.
세션은 명시적 또는 암시적일 수 있습니다. 명시적 세션의 수명은 애플리케이션에서 관리하며, 애플리케이션 명시적 세션은 이러한 세션을 생성하고 명시적으로 종료합니다. 암시적 세션은 세션(3.6이상)을 지원하는 서버에 작업을 보낼 때 드라이버에 의해 자동으로 생성되며, 세션의 수명은 드라이버에 의해 관리됩니다.
암시적 세션이 생성되면 해당 세션과 연결된 서버 세션을 가질 수 없습니다. 이 세션을 사용하는 작업이 실제로 실행되면 서버 세션이 세션 풀에서 체크아웃됩니다. 명시적 세션이 생성될 때는 이미 할당된 서버 세션을 참조해야 합니다.
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# 파일 'lib/ Mongo/session.rb', 83줄 def 초기화(server_session, 고객, = {}) 만약 [:causal_consistency] && [: 스냅샷] 올리다 ArgumentError, ':causal_consistency 및 :snapshot 옵션을 둘 다 설정할 수 없습니다. end 만약 [:implicit] 하지 않는 한 server_session.nil? 올리다 ArgumentError, '암시적 세션은 구성 중에 서버 세션을 참조할 수 없습니다. ' end other 만약 server_session.nil? 올리다 ArgumentError, '명시적 세션은 구성 중에 서버 세션을 참조해야 합니다. ' end end @server_session = server_session = .dup @client = 고객.메서드를(: admin) @options = .dup.동결 @cluster_time = nil @ 상태 = NO_TRANSACTION_STATE @with_transaction_deadline = nil end |
인스턴스 속성 세부 정보
#클라이언트 ⇒ 클라이언트 (읽기 전용)
이 세션이 생성된 클라이언트를 반환합니다.
116 117 118 |
# 파일 'lib/ Mongo/session.rb', 116줄 def 고객 @client end |
#operation_time ⇒ BSON::Timestamp (읽기 전용)
이 세션에 대해 가장 최근에 본 optime 을 반환합니다.
131 132 133 |
# 파일 'lib/ Mongo/session.rb', 131줄 def operation_time @operation_time end |
#options ⇒ 해시 (읽기 전용)
이 세션에 대한 옵션을 반환합니다.
111 112 113 |
# 파일 'lib/ Mongo/session.rb', 111줄 def @options end |
#pinned_connection_global_id ⇒ 정수 | nil (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 세션이 고정된 연결 글로벌 ID(있는 경우)를 반환합니다.
284 285 286 |
# 파일 'lib/ Mongo/session.rb', 284줄 def pinned_connection_global_id @pinned_connection_global_id end |
#pinned_server ⇒ MongoDB 서버 | nil (읽기 전용)
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 세션이 고정된 서버 ( mongos)를 반환합니다(있는 경우).
278 279 280 |
# 파일 'lib/ Mongo/session.rb', 278줄 def pinned_server @pinned_server end |
#recovery_token ⇒ BSON::Document | nil
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 세션에서 실행 중인 샤딩된 트랜잭션 에 대한 복구 토큰을 반환합니다(있는 경우).
290 291 292 |
# 파일 'lib/ Mongo/session.rb', 290줄 def recovery_token @recovery_token end |
#snapshot_timestamp ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
1192 1193 1194 |
# 파일 'lib/ Mongo/session.rb', 1192줄 def @snapshot_timestamp end |
#with_transaction_deadline ⇒ 객체(읽기 전용)
1194 1195 1196 |
# 파일 'lib/ Mongo/session.rb', 1194줄 def with_transaction_deadline @with_transaction_deadline end |
인스턴스 메서드 세부 정보
#abort_transaction(options = nil) ⇒ 객체
데이터베이스 를 변경하지 않고 현재 활성 트랜잭션 을 중단합니다.
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', 730줄 def abort_transaction( = nil) 쿼리 캐시.지우기 check_if_ended! check_if_no_transaction! 만약 into_states?(TRANSACTION_COMMITTED_STATE) 올리다 mongo::오류::InvalidTransactionOperation.신규( mongo::오류::InvalidTransactionOperation.can_call_after_msg( :commitTransaction, :abortTransaction)) end 만약 into_states?(TRANSACTION_ABORTED_STATE) 올리다 mongo::오류::InvalidTransactionOperation.신규( mongo::오류::InvalidTransactionOperation.can_call_twice_msg(:abortTransaction)) end ||= {} 시작 하지 않는 한 startup_transaction? @aborting_transaction = true 컨텍스트 = 작업::Context.신규( 클라이언트: @client, 세션: self, operation_timeout: operation_timeout() ) write_with_retry([:write_concern], end_transaction: true, 컨텍스트: 컨텍스트, ) do |연결, txn_num, 컨텍스트| 시작 작업::명령.신규( 선택기: { abortTransaction: 1 }, db_name: 'admin', 세션: self, txn_num: txn_num ).execution_with_connection(연결, 컨텍스트: 컨텍스트) 보장 고정 해제 end end end @ 상태 = TRANSACTION_ABORTED_STATE 구출 mongo::오류::InvalidTransactionOperation 올리다 구출 mongo::오류 @ 상태 = TRANSACTION_ABORTED_STATE 구출 예외 @ 상태 = TRANSACTION_ABORTED_STATE 올리다 보장 @aborting_transaction = 거짓 end # 공식 반환 값은 없지만 true를 반환하므로 인터랙티브 # 성공했음을 알리는 메서드 힌트를 사용합니다. true end |
#aborting_transaction? ⇒ true | false
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
반환값 세션이 현재 트랜잭션을 중단하고 있는지 여부를 반환합니다.
819 820 821 |
# 파일 'lib/ Mongo/session.rb', 819줄 def aborting_transaction? !!@aborting_transaction end |
#add_autocommit!(명령) ⇒ 해시, BSON::Document
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
해당하는 경우 명령 문서에 자동 커밋 필드를 추가합니다.
899 900 901 902 903 |
# 파일 'lib/ Mongo/session.rb', 899줄 def add_autocommit!(명령) 명령.탭 do |C| C[:autocommit] = 거짓 만약 in_transaction? end end |
#add_start_transaction!(명령) ⇒ 해시, BSON::Document
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
해당하는 경우 명령 문서에 startTransaction 필드를 추가합니다.
914 915 916 917 918 919 920 |
# 파일 'lib/ Mongo/session.rb', 914줄 def add_start_transaction!(명령) 명령.탭 do |C| 만약 startup_transaction? C[:startTransaction] = true end end end |
#add_txn_num!(명령) ⇒ 해시, BSON::Document
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
해당하는 경우 명령 문서에 트랜잭션 번호를 추가합니다.
931 932 933 934 935 |
# 파일 'lib/ Mongo/session.rb', 931줄 def add_txn_num!(명령) 명령.탭 do |C| C[:txnNumber] = BSON::Int64.신규(@server_session.txn_num) 만약 in_transaction? end end |
#add_txn_opts!(명령, 읽기, 컨텍스트) ⇒ 해시, BSON::Document
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
해당하는 경우 트랜잭션 옵션을 추가합니다.
946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 |
# 파일 'lib/ Mongo/session.rb', 946줄 def add_txn_opts!(명령, 읽기, 컨텍스트) 명령.탭 do |C| # 트랜잭션을 시작하는 모든 명령에 읽기 고려를 추가해야 합니다. 만약 startup_transaction? # https://jira.mongodb.org/browse/spec-1161: 트랜잭션의 # 읽기 고려는 컬렉션/데이터베이스/클라이언트 읽기 고려를 재정의합니다. # 트랜잭션의 읽기 고려가 설정되지 않은 경우에도 마찬가지입니다. # 여기서 읽기 고려는 서버 로 전송되는 고려이며 # afterClusterTime을 포함합니다. 만약 rc = C[:readConcern] rc = rc.dup rc.삭제(:level) end 만약 txn_read_concern 만약 rc rc.update(txn_read_concern) other rc = txn_read_concern.dup end end 만약 rc.nil? || rc.비어 있나요? C.삭제(:readConcern) other C[:readConcern ] = 옵션::매퍼.transform_values_to_strings(rc) end end # 읽기 고려 수준을 기호가 아닌 string 로 보내야 합니다. 만약 C[:readConcern] C[:readConcern] = 옵션::매퍼.transform_values_to_strings(C[:readConcern]) end 만약 C[:commitTransaction] 만약 max_time_ms = [:max_commit_time_ms] C[:maxTimeMS] = max_time_ms end end # 쓰기 고려 (write concern) 고려는 모든 abortTransaction 또는 commitTransaction 명령에 추가되어야 합니다. 만약 (C[:abortTransaction] || C[:commitTransaction]) 만약 @already_committed wc = BSON::문서.신규(C[:writeConcern] || txn_write_concern || {}) wc.병합!(w: :majority) wc[:wtimeout] ||= 10000 C[:writeConcern] = wc elsif txn_write_concern C[:writeConcern] ||= txn_write_concern end end # 숫자가 아닌 쓰기 고려 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 만약 컨텍스트&.csot? C[:writeConcern]&.삭제(:wtimeout) end # 빈(서버 기본값) 쓰기 고려 (write concern) 보내지 않아야 합니다. C.삭제(:writeConcern) 만약 C[:writeConcern]&.비어 있나요? end end |
#advanced_operation_time(new_operation_time) ⇒ BSON::Timestamp
이 세션의 캐시된 optime을 앞당깁니다.
1123 1124 1125 1126 1127 1128 1129 |
# 파일 'lib/ Mongo/session.rb', 1123줄 def advanced_operation_time(new_operation_time) 만약 @operation_time @operation_time = [ @operation_time, new_operation_time ].최대 other @operation_time = new_operation_time end end |
#cluster ⇒ Object
118 119 120 |
# 파일 'lib/ Mongo/session.rb', 118줄 def cluster @client.cluster end |
#commit_transaction(options = nil) ⇒ 객체
세션에서 현재 활성 트랜잭션 을 커밋합니다.
648 649 650 651 652 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 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 |
# 파일 'lib/ Mongo/session.rb', 648줄 def commit_transaction(=nil) 쿼리 캐시.지우기 check_if_ended! check_if_no_transaction! 만약 into_states?(TRANSACTION_ABORTED_STATE) 올리다 mongo::오류::InvalidTransactionOperation.신규( mongo::오류::InvalidTransactionOperation.can_call_after_msg( :abortTransaction, :commitTransaction)) end ||= {} 시작 # commitTransaction이 두 번 호출되면 동일한 커밋 을 실행 해야 합니다. # 작업을 다시 수행하므로 세션을 이전 상태 로 되돌립니다. 만약 into_states?(TRANSACTION_COMMITTED_STATE) @ 상태 = @last_commit_skiped ? STARTING_TRANSACTION_STATE : TRANSACTION_IN_PROGRESS_STATE @already_committed = true end 만약 startup_transaction? @last_commit_skiped = true other @last_commit_skiped = 거짓 @committing_transaction = true write_concern = [:write_concern] || [:write_concern] 만약 write_concern && !write_concern.is_a?(writeConcern::Base) write_concern = writeConcern.get(write_concern) end 컨텍스트 = 작업::Context.신규( 클라이언트: @client, 세션: self, operation_timeout: operation_timeout() ) write_with_retry(write_concern, end_transaction: true, 컨텍스트: 컨텍스트, ) do |연결, txn_num, 컨텍스트| 만약 컨텍스트.재시도? 만약 write_concern wco = write_concern..merge(w: :majority) wco[:wtimeout] ||= 10000 write_concern = writeConcern.get(wco) other write_concern = writeConcern.get(w: :majority, wtimeout: 10000) end end 사양 = { 선택기: { commitTransaction: 1 }, db_name: 'admin', 세션: self, txn_num: txn_num, write_concern: write_concern, } 작업::명령.신규(사양).execution_with_connection(연결, 컨텍스트: 컨텍스트) end end 보장 @ 상태 = TRANSACTION_COMMITTED_STATE @committing_transaction = 거짓 end # 공식 반환 값은 없지만 true를 반환하므로 인터랙티브 # 성공했음을 알리는 메서드 힌트를 사용합니다. true end |
#committing_transaction? ⇒ true | false
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
세션이 현재 트랜잭션을 커밋하고 있는지 여부를 반환합니다.
811 812 813 |
# 파일 'lib/ Mongo/session.rb', 811줄 def committing_transaction? !!@committing_transaction end |
#더티!(mark = true) ⇒ 객체
더티 상태 기본 서버 세션에 지정된 값으로 설정합니다. 서버 세션이 없으면 아무 작업도 수행하지 않습니다.
138 139 140 |
# 파일 'lib/ Mongo/session.rb', 138줄 def dirty!(표시 = true) @server_session&.dirty!(표시) end |
#더티? ⇒ true | false | nil
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
기본 서버 세션이 더티인지 여부를 반환합니다. 이 세션에 대한 서버 세션이 없으면 nil을 반환합니다.
146 147 148 |
# 파일 'lib/ Mongo/session.rb', 146줄 def dirty? @server_session&.dirty? end |
#end_session ⇒ nil
이 세션을 종료합니다.
이 세션에서 진행 중인 트랜잭션이 있는 경우 트랜잭션이 중단됩니다. 이 세션과 연결된 서버 세션이 서버 세션 풀로 반환됩니다. 마지막으로 이 세션은 종료됨으로 표시되어 더 이상 사용할 수 없습니다.
이 세션이 이미 종료된 경우 이 메서드는 아무 작업도 수행하지 않습니다.
이 메서드는 이름에서 알 수 있듯이 이 서버에 endSessions 명령을 직접 실행하지 않습니다.
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 |
# 파일 'lib/ Mongo/session.rb', 377줄 def end_session 만약 !종료? && @client 만약 into_states?(TRANSACTION_IN_PROGRESS_STATE) 시작 abort_transaction 구출 mongo::오류, 오류::AuthError end end 만약 @server_session @client.cluster.session_pool.checkin(@server_session) end end 보장 @server_session = nil @ended = true end |
#종료되었나요? ⇒ true, false
이 세션이 종료되었는지 여부입니다.
243 244 245 |
# 파일 'lib/ Mongo/session.rb', 243줄 def 종료? !!@ended end |
#명시적? ⇒ true, false
이 세션이 명시적 세션입니까(예: 사용자 생성).
178 179 180 |
# 파일 'lib/ Mongo/session.rb', 178줄 def explicit? !암시적? end |
#암시적? ⇒ true, false
이 세션이 암시적 세션입니까(사용자가 생성하지 않음).
166 167 168 |
# 파일 'lib/ Mongo/session.rb', 166줄 def 암시적? @implicit ||= !!(@options.키?(:implicit) && @options[:implicit] == true) end |
#in_transaction? ⇒ true | false
세션이 현재 트랜잭션 중인지 여부입니다.
803 804 805 |
# 파일 'lib/ Mongo/session.rb', 803줄 def in_transaction? into_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE) end |
#검사 ⇒ string
검사에 사용할 형식이 지정된 string 을 가져옵니다.
355 356 357 |
# 파일 'lib/ Mongo/session.rb', 355줄 def 검사 "#<Mongo::Session:0x#{object_id} session_id=#{session_id} options=#{@options}>" end |
#materialize_if_needed ⇒ 세션
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
아직 설정하다 되지 않은 경우 세션 풀에서 세션을 체크아웃하여 세션 객체의 server_session을 채웁니다.
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 |
# 파일 'lib/ Mongo/session.rb', 1137줄 def Materialize_if_needed 만약 종료? 올리다 오류::SessionEnded end 반환 하지 않는 한 암시적? && !@server_session @server_session = cluster.session_pool.결제 self end |
#구체화되었나요? ⇒ 부울
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
1150 1151 1152 1153 1154 1155 1156 |
# 파일 'lib/ Mongo/session.rb', 1150줄 def 구체화? 만약 종료? 올리다 오류::SessionEnded end !@server_session.nil? end |
#Next_txn_num ⇒ 정수
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
다음 트랜잭션 번호를 증가시키고 반환합니다.
1167 1168 1169 1170 1171 1172 1173 |
# 파일 'lib/ Mongo/session.rb', 1167줄 def Next_txn_num 만약 종료? 올리다 오류::SessionEnded end @server_session.Next_txn_num end |
#pin_to_connection(connection_global_id) ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 세션을 지정된 연결에 고정합니다.
이 세션을 대상으로 합니다.
846 847 848 849 850 851 |
# 파일 'lib/ Mongo/session.rb', 846줄 def pin_to_connection(connection_global_id) 만약 connection_global_id.nil? 올리다 ArgumentError, 'nil 연결 ID에 고정할 수 없습니다.' end @pinned_connection_global_id = connection_global_id end |
#pin_to_server(서버) ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 세션을 지정된 서버( mongos 여야 함)에 고정합니다.
828 829 830 831 832 833 834 835 836 837 838 |
# 파일 'lib/ Mongo/session.rb', 828줄 def pin_to_server(서버) 만약 서버.nil? 올리다 ArgumentError, 'nil 서버에 고정할 수 없습니다.' end 만약 Lint.활성화? 하지 않는 한 서버.mongos? 올리다 오류::LintError, " Mongos가서버 #{server .summary}에 세션을 고정하려고 시도했습니다 .mongos" end end @pinned_server = 서버 end |
#프로세스(결과) ⇒ Operation::Result
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 세션을 사용한 서버의 응답을 처리합니다.
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 |
# 파일 'lib/ Mongo/session.rb', 1095줄 def 프로세스(결과) 하지 않는 한 암시적? set_operation_time(결과) 만약 cluster_time_doc = 결과.cluster_time advanced_cluster_time(cluster_time_doc) end end @server_session.set_last_use! 만약 doc = 결과.회신 && 결과.회신.문서.first 만약 doc[:recoveryToken] self.recovery_token = doc[:recoveryToken] end end 결과 end |
#retry_reads? ⇒ 부울
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
최신 재시도 가능 읽기 사양에 따라 이 세션에서 실행된 읽기를 재시도할 수 있는지 여부입니다.
이 메서드가 true를 반환하면 애플리케이션 에서 최신 재시도 가능 읽기를 요청한 것입니다. 읽기 작업을 위해 선택한 서버 가 최신 재시도 가능 읽기를 지원하는 경우 해당 서버가 특정 작업에 사용됩니다. 읽기 작업을 위해 선택한 서버 가 최신 재시도 가능 읽기를 지원 하지 않는 경우 읽기가 재시도되지 않습니다.
이 메서드가 false를 반환하면 애플리케이션에서 레거시 재시도 가능 읽기를 요청한 것입니다. 레거시 재시도 가능 읽기 로직은 클라이언트가 연결된 서버의 서버 버전에 관계없이 사용됩니다. 읽기 재시도 횟수는 :max_read_retries 클라이언트 옵션에 의해 지정되며, 이 값은 기본적으로 1 이며 0 으)로 설정하여 레거시 읽기 재시도를 비활성화할 수 있습니다.
198 199 200 |
# 파일 'lib/ Mongo/session.rb', 198줄 def retry_reads? 고객.[:retry_reads] != 거짓 end |
#retry_writes? ⇒ true, false
재시도 가능 쓰기는 서버 버전이 3.6 이상이고 샤드 클러스터, 복제본 세트 또는 부하 분산 토폴로지가 있는 서버에서만 사용할 수 있습니다.
이 세션으로 실행된 쓰기가 재시도됩니다.
213 214 215 |
# 파일 'lib/ Mongo/session.rb', 213줄 def retry_writes? !!고객.[:retry_writes] && (cluster.replica_set? || cluster.? || cluster.load_balancing?) end |
#session_id ⇒ BSON::Document
세션이 종료되지 않은 경우 이 세션의 서버 세션 ID를 가져옵니다. 세션이 종료된 경우 Error::SessionEnded가 발생합니다.
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 |
# 파일 'lib/ Mongo/session.rb', 255줄 def session_id 만약 종료? 올리다 오류::SessionEnded end # 명시적 세션에는 항상 session_id가 있습니다. # 구성 서버 세션을 제공해야 합니다. 암시적 세션 # 구체화될 때까지 session_id가 없으므로 다음을 호출합니다. # session_id가 실패할 수 있습니다. 애플리케이션에 기회가 없어야 함 # 암시적 세션이 활성화되어서는 안 되므로 이 실패가 발생합니다. # 수명이 다음으로 제한되어 애플리케이션에서 액세스할 수 있습니다. # 작업 실행은 전적으로 운전자 에 의해 수행됩니다. 하지 않는 한 구체화? 올리다 오류::SessionNotMaterialized end @server_session.session_id end |
스냅샷 #개? ⇒ true | false
반환값 세션이 스냅샷 읽기에 대해 구성되었는지 여부를 반환합니다.
124 125 126 |
# 파일 'lib/ Mongo/session.rb', 124줄 def 스냅샷? !![: 스냅샷] end |
#start_transaction(options = nil) ⇒ 객체
이 세션의 후속 작업을 새 트랜잭션 에 배치합니다.
start_transaction이 호출된 후 작업이 수행될 때까지 서버에서 트랜잭션이 시작되지 않습니다.
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 627 628 629 630 631 |
# 파일 'lib/ Mongo/session.rb', 583줄 def start_transaction( = nil) check_transactions_supported! 만약 Lint.validate_read_concern_option([:read_concern]) =begin # 여기서 잘못된 읽기 설정을 감지하면 편리하지만 # 일부 사양 테스트에서는 나중에 잘못된 읽기 설정을 감지해야 합니다. # 린트 모드 가 켜져 있을 때 이 작업을 수행할 수 있습니다. mode = options[:read] && options[:read][:mode].to_s if 모드 && 모드 != 'primary' Mongo::Error::InvalidTransactionOperation.new( "트랜잭션의 읽기 설정은 프라이머리여야 합니다(요청: #{모드})" ) end =end end 만약 스냅샷? 올리다 mongo::오류::SnapshotSessionTransactionProhibited end check_if_ended! 만약 into_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE) 올리다 mongo::오류::InvalidTransactionOperation.신규( mongo::오류::InvalidTransactionOperation::TRANSACTION_ALREADY_IN_PROGRESS) end 고정 해제 Next_txn_num @txn_options = (@options[:default_transaction_options] || {}).merge( || {}) 만약 txn_write_concern && !writeConcern.get(txn_write_concern).인정? 올리다 mongo::오류::InvalidTransactionOperation.신규( mongo::오류::InvalidTransactionOperation::UNACKNOWLEDGED_WRITE_CONCERN) end @ 상태 = STARTING_TRANSACTION_STATE @already_committed = 거짓 # 이 메서드에는 명시적인 반환 값이 없습니다. # 여기서 nil을 반환할 수 있지만 true는 사용자에게 다음을 나타냅니다. 작업 #개가 성공했습니다. 이는 대화형으로 사용하기 위한 것입니다. # 반환 값은 문서화되어 있지 않습니다. true end |
#startup_transaction? ⇒ 부울
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
791 792 793 |
# 파일 'lib/ Mongo/session.rb', 791줄 def startup_transaction? into_states?(STARTING_TRANSACTION_STATE) end |
#Suppress_read_write_concern!(명령) ⇒ 해시, BSON::Document
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
해당 사항이 없는 경우 명령에서 읽기 고려 및/또는 쓰기 고려를 제거합니다.
1020 1021 1022 1023 1024 1025 1026 1027 |
# 파일 'lib/ Mongo/session.rb', 1020줄 def Suppress_read_write_concern!(명령) 명령.탭 do |C| 다음 하지 않는 한 in_transaction? C.삭제(:readConcern) 하지 않는 한 startup_transaction? C.삭제(:writeConcern) 하지 않는 한 C[:commitTransaction] || C[:abortTransaction] end end |
#txn_num ⇒ 정수
현재 트랜잭션 번호를 가져옵니다.
1183 1184 1185 1186 1187 1188 1189 |
# 파일 'lib/ Mongo/session.rb', 1183줄 def txn_num 만약 종료? 올리다 오류::SessionEnded end @server_session.txn_num end |
#txn_options ⇒ 해시
이 세션에서.
154 155 156 |
# 파일 'lib/ Mongo/session.rb', 154줄 def @txn_options or 올리다 ArgumentError, "활성 트랜잭션 이 없습니다" end |
#txn_read_preference ⇒ 해시
세션이 현재 활성 트랜잭션 에서 사용할 읽기 설정 (read preference) 을 가져옵니다.
밑줄 키가 있는 운전자 스타일 해시입니다.
228 229 230 231 232 233 |
# 파일 'lib/ Mongo/session.rb', 228줄 def txn_read_preference rp = [:read] || @client.read_preference mongo::Lint.validate_underscore_read_preference(rp) rp end |
#unpin(connection = nil) ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
세션이 고정된 경우 고정된 서버 또는 연결에서 이 세션의 고정을 해제합니다.
859 860 861 862 863 |
# 파일 'lib/ Mongo/session.rb', 859줄 def 고정 해제(연결 = nil) @pinned_server = nil @pinned_connection_global_id = nil 연결.고정 해제 하지 않는 한 연결.nil? end |
#unpin_maybe(오류, 연결 = nil) ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
세션이 고정되었고 지정된 예외 인스턴스 및 세션의 트랜잭션 상태에 따라 고정을 해제해야 하는 경우 고정된 서버 또는 연결에서 이 세션의 고정을 해제합니다.
예외 인스턴스 에는 이미 모든 레이블이 설정하다 되어 있어야 합니다( 클라이언트 및 서버 측에서 생성된 레이블 모두).
876 877 878 879 880 881 882 883 884 885 886 887 888 |
# 파일 'lib/ Mongo/session.rb', 876줄 def unpin_maybe(오류, 연결 = nil) 만약 !into_states?(Session::NO_TRANSACTION_STATE) && 오류.레이블?('TransientTransactionError') then 고정 해제(연결) end 만약 committing_transaction? && 오류.레이블?('UnknownTransactionCommitResult') then 고정 해제(연결) end end |
#update_state! ⇒ Object
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
(비커밋 및 비중단) 작업 실행 으로 인한 세션 상태 를 업데이트합니다.
1056 1057 1058 1059 1060 1061 1062 1063 |
# 파일 'lib/ Mongo/session.rb', 1056줄 def update_state! case @ 상태 when STARTING_TRANSACTION_STATE @ 상태 = TRANSACTION_IN_PROGRESS_STATE when TRANSACTION_COMMITTED_STATE, TRANSACTION_ABORTED_STATE @ 상태 = NO_TRANSACTION_STATE end end |
#validate!(client) ⇒ Session
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
지정된 클라이언트 에서 사용할 세션의 유효성을 검사합니다.
세션은 종료되지 않아야 하며 세션과 함께 사용할 클라이언트 와 동일한 클러스터 를 가진 클라이언트 가 생성한 것이어야 합니다.
1078 1079 1080 1081 1082 |
# 파일 'lib/ Mongo/session.rb', 1078줄 def 유효성을 검사합니다!(고객) check_matting_cluster!(고객) check_if_ended! self end |
#validate_read_preference!(명령) ⇒ 객체
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
명령의 읽기 기본 설정이 프라이머리인지 확인합니다.
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 |
# 파일 'lib/ Mongo/session.rb', 1039줄 def validate_read_preference!(명령) 반환 하지 않는 한 in_transaction? 반환 하지 않는 한 명령['$readPreference'] 모드 = 명령['$readPreference']['mode'] || 명령['$readPreference'][:mode] 만약 모드 && 모드 != '프라이머리' 올리다 mongo::오류::InvalidTransactionOperation.신규( "트랜잭션의 읽기 설정은 프라이머리여야 합니다(요청: #{모드})" ) end end |
#with_transaction(options = nil) ⇒ 객체
with_transaction에 루프가 포함되어 있으므로 with_transaction 자체가 루프에 배치된 경우 해당 블록은 외부 루프를 제어하기 위해 다음 또는 중단을 호출해서는 안 됩니다. 이는 대신 with_transaction의 루프에 영향을 미치기 때문입니다. 드라이버는 이러한 상황을 감지하면 경고를 보내고 트랜잭션을 중단합니다.
트랜잭션 에서 제공된 차단 을 실행하고 필요에 따라 다시 시도합니다.
차단 의 반환 값을 반환합니다.
정확한 재시도 횟수와 수행 시점은 드라이버의 구현 세부 정보입니다. 제공된 블록은 멱등성이 있어야 하며 두 번 이상 호출될 수 있도록 준비해야 합니다. 발생한 오류에 따라 드라이버는 활성 트랜잭션 내에서 커밋 명령을 다시 시도하거나 트랜잭션을 반복하고 차단을 다시 호출할 수 있습니다. 재시도는 다른 서버에 대해 실행될 수 있습니다.
트랜잭션을 중첩할 수 없음 - 세션에 이미 활성 트랜잭션이 있을 때 이 메서드를 호출하면 InvalidTransactionOperation이 발생합니다.
Mongo::Error에서 파생되지 않은 차단 에서 발생한 예외는 처리 를 중지하고 트랜잭션 을 중단하며 with_transaction 밖으로 전파됩니다. Mongo::Error 에서 파생된 예외는 with_transaction으로 처리되어 프로세스 가 재시도될 수 있습니다.
현재 with_transaction은 with_transaction이 실행되기 시작한 후 최소 120 초가 경과할 때까지 커밋을 재시도하고 호출을 차단합니다. 이 시간 제한은 구성할 수 없으며 향후 드라이버 버전에서 변경될 수 있습니다.
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 |
# 파일 'lib/ Mongo/session.rb', 448줄 def with_transaction( = nil) 만약 timeout_ms = ( || {})[:timeout_ms] timeout_sec = timeout_ms / 1_000.0 마감일 = Utils.단조적 시간 + timeout_sec @with_transaction_deadline = 마감일 elsif default_timeout_ms = @options[:default_timeout_ms] timeout_sec = default_timeout_ms / 1_000.0 마감일 = Utils.단조적 시간 + timeout_sec @with_transaction_deadline = 마감일 elsif @client.timeout_sec 마감일 = Utils.단조적 시간 + @client.timeout_sec @with_transaction_deadline = 마감일 other 마감일 = Utils.단조적 시간 + 120 end transaction_in_progress = 거짓 루프 do = {} 만약 [:write_concern] = [:write_concern] end start_transaction() transaction_in_progress = true 시작 rv = yield self 구출 예외 => e 만약 into_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE) log_warn("#{e.class}로 인해 트랜잭션이 중단되었습니다: #{e}") @with_transaction_deadline = nil abort_transaction transaction_in_progress = 거짓 end 만약 Utils.단조적 시간 >= 마감일 transaction_in_progress = 거짓 올리다 end 만약 e.is_a?(mongo::오류) && e.레이블?('TransientTransactionError') 다음 end 올리다 other 만약 into_states?(TRANSACTION_ABORTED_STATE, NO_TRANSACTION_STATE, TRANSACTION_COMMITTED_STATE) transaction_in_progress = 거짓 반환 rv end 시작 commit_transaction() transaction_in_progress = 거짓 반환 rv 구출 mongo::오류 => e 만약 e.레이블?('UnknownTransactionCommitResult') 만약 Utils.단조적 시간 >= 마감일 || e.is_a?(오류::OperationFailure::가족) && e.max_time_ms_expired? then transaction_in_progress = 거짓 올리다 end = case v = [:write_concern] when writeConcern::Base v. when nil {} other v end [:write_concern] = .merge(w: :majority) 재시도 elsif e.레이블?('TransientTransactionError') 만약 Utils.단조적 시간 >= 마감일 transaction_in_progress = 거짓 올리다 end @ 상태 = NO_TRANSACTION_STATE 다음 other transaction_in_progress = 거짓 올리다 end 구출 오류::AuthError transaction_in_progress = 거짓 올리다 end end end # 공식 반환 값은 없지만 true를 반환하므로 인터랙티브 # 성공했음을 알리는 메서드 힌트를 사용합니다. true 보장 만약 transaction_in_progress log_warn('with_transaction 콜백이 with_transaction 루프에서 벗어나 트랜잭션을 중단하는 중') 시작 abort_transaction 구출 오류::OperationFailure::가족, 오류::InvalidTransactionOperation end end @with_transaction_deadline = nil end |