Docs Menu
Docs Home
/ / /
루비 드라이버
/

트랜잭션

이 가이드 에서는 Ruby 운전자 사용하여 트랜잭션을 수행하는 방법을 학습 수 있습니다. 트랜잭션을 사용하면 전체 트랜잭션 이 커밋된 경우에만 데이터를 변경하는 일련의 작업을 수행할 수 있습니다. 트랜잭션 의 작업이 성공하지 못하면 운전자 트랜잭션 중지하고 데이터 변경 사항이 표시되기 전에 모든 데이터 변경 사항을 삭제합니다. 이 기능 원자성 이라고 합니다.

MongoDB 에서 트랜잭션은 논리적 세션 내에서 실행 . 세션은 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업의 그룹입니다. 세션을 사용하면 작업 그룹 에 인과적 일관성 활성화 원자성, 일관성, 격리 및 내구성에 대한 기대치를 충족하는 트랜잭션 인 ACID 호환 트랜잭션 에서 작업을 실행 수 있습니다. MongoDB 작업에 예기치 않은 오류가 발생하더라도 트랜잭션 작업과 관련된 데이터가 일관적인 유지하도록 보장 .

Ruby 운전자 사용하는 경우 클라이언트 에서 start_session 메서드를 호출하여 세션을 시작할 수 있습니다. 그런 다음 세션 내에서 트랜잭션을 수행할 수 있습니다.

경고

세션을 생성한 Mongo::Client 에서 실행 작업에서만 세션을 사용합니다. 다른 Mongo::Client 로 세션을 사용하면 작업 오류가 발생합니다.

MongoDB 특정 클라이언트 세션에서 인과적 일관성 지원합니다. 인과적 일관성 모델은 분산된 시스템에서 세션 내의 작업이 인과적 순서로 실행 보장 . 클라이언트는 인과 관계 또는 작업 간의 종속성과 일관적인 결과를 관찰합니다. 예시 를 들어, 한 작업이 논리적으로 다른 작업의 결과에 따라 달라지는 일련의 작업을 수행하는 경우 모든 후속 읽기에는 종속 관계 반영됩니다.

인과적 일관성 보장하려면 클라이언트 세션이 다음 요구 사항을 충족해야 합니다.

  • 세션을 시작할 때 운전자 인과적 일관성 옵션을 활성화 해야 합니다. 이 옵션은 기본값 으로 활성화되어 있습니다.

  • 작업은 단일 스레드의 단일 세션에서 실행 되어야 합니다. 그렇지 않으면 세션 또는 스레드가 optime 및 클러스터 시간 값을 서로 통신해야 합니다. 이러한 값을 전달하는 두 세션의 예시 보려면 MongoDB Server 매뉴얼에서 인과적 일관성 예시 를 참조하세요.

  • 반드시 :majority 읽기 고려 (read concern) 사용해야 합니다.

  • 반드시 :majority 쓰기 고려 (write concern) 사용해야 합니다. 이는 기본값 쓰기 고려 (write concern) 값입니다.

다음 표에서는 인과적으로 일관적인 세션이 제공하는 보장 에 대해 설명합니다.

보장
설명

쓰기 읽기

읽기 작업은 이전 쓰기 (write) 작업의 결과를 반영합니다.

단조적 읽기

읽기 작업은 이전 읽기 작업보다 이전 데이터 상태 반영하는 결과를 반환하지 않습니다.

단조로운 쓰기

쓰기 (write) 작업이 다른 쓰기 (write) 작업보다 먼저 수행되어야 하는 경우 서버 이 쓰기 (write) 작업을 먼저 실행합니다.

예시 를 들어 insert_one() 를 호출하여 문서 삽입한 다음 update_one() 를 호출하여 삽입된 문서 수정하면 서버 먼저 삽입 작업을 실행합니다.

읽기 후 쓰기

쓰기 (write) 작업이 다른 읽기 작업 뒤에 와야 하는 경우 서버 읽기 작업을 먼저 실행합니다.

예시 를 들어 find() 를 호출하여 문서 조회 다음 delete_one() 를 호출하여 조회된 문서 삭제 하면 서버 먼저 찾기 작업을 실행합니다.

이 섹션에 언급된 개념에 대해 자세히 학습 다음 MongoDB Server 매뉴얼 항목을 참조하세요.

start_session 메서드를 호출하여 세션을 시작한 후 Mongo::Session 클래스의 메서드를 사용하여 세션 상태 관리 할 수 있습니다. 다음 표에서는 트랜잭션 관리 데 사용할 수 있는 메서드에 대해 설명합니다.

메서드
설명

start_transaction

Starts a new transaction on this session. You cannot start a transaction if there's already an active transaction running in the session.

You can set transaction options including read concern, write concern, and read preference by passing a Hash as a parameter.

commit_transaction

Commits the active transaction for this session. This method returns an error if there is no active transaction for the session, the transaction was previously ended, or if there is a write conflict.

abort_transaction

Ends the active transaction for this session. This method returns an error if there is no active transaction for the session or if the transaction was committed or ended.

with_transaction

Starts a transaction prior to calling the supplied block, and commits the transaction when the block finishes. If any of the operations in the block, or the commit operation, result in a transient transaction error, the block and/or the commit will be executed again.

이 예시 sample_mflix 데이터베이스 컬렉션의 데이터를 수정하는 run_transaction 메서드를 정의합니다. 이 코드는 다음 조치를 수행합니다.

  • Mongo::Collection 인스턴스를 생성하여 moviesusers 컬렉션에 액세스 .

  • 트랜잭션 에 대한 읽기 및 쓰기 (write) 고려를 지정합니다.

  • 트랜잭션 시작합니다.

  • movies 컬렉션 에 문서 삽입하고 결과를 인쇄합니다.

  • users 컬렉션 의 문서 업데이트하고 결과를 인쇄합니다.

database = client.use('sample_mflix')
movies_collection = database[:movies]
users_collection = database[:users]
def run_transaction(session, movies_collection, users_collection)
transaction_options = {
read_concern: { level: "snapshot" },
write_concern: { w: "majority" }
}
session.with_transaction(transaction_options) do
# Inserts document into the "movies" collection
insert_result = movies_collection.insert_one({ name: 'The Menu', runtime: 107 }, session: session)
puts "Insert completed: #{insert_result.inspect}"
# Updates document in the "users" collection
update_result = users_collection.update_one({ name: 'Amy Phillips'}, { "$set" => { name: 'Amy Ryan' }}, session: session)
puts "Update completed: #{update_result.inspect}"
end
end
# Starts a session
session = client.start_session
begin
# Runs the transaction
run_transaction(session, movies_collection, users_collection)
puts "Transaction committed successfully."
rescue Mongo::Error::OperationFailure => e
puts "Transaction failed and was aborted. Error: #{e.message}"
ensure
session.end_session
end

참고

병렬 작업이 지원되지 않음

Ruby 운전자 단일 트랜잭션 내에서 병렬 작업 실행 지원 하지 않습니다.

MongoDB Server v8.0 이상을 사용하는 경우 bulk_write 메서드를 사용하여 단일 트랜잭션 내에서 여러 네임스페이스에 대한 쓰기 (write) 작업을 수행할 수 있습니다. 자세한 내용은 대량 쓰기 작업 가이드 참조하세요.

이 가이드 에 언급된 개념에 학습 보려면 MongoDB Server 매뉴얼의 다음 페이지를 참조하세요.

ACID compliance 에 대해 자세히 학습 MongoDB 웹사이트 에서 A Guide to ACID Properties in Database Management Systems(데이터베이스 관리 시스템의 ACID 속성 가이드) 문서를 참조하세요.

삽입 작업에 대해 자세히 알아보려면 문서 삽입 가이드를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

대량 쓰기 작업

이 페이지의 내용