티스토리 뷰

DB/MongoDB

[MongoDB] 트랜잭션

snail voyager 2023. 7. 2. 20:03
728x90
반응형

8.1 트랜잭션 소개

  • 트랜잭션은 읽기나 쓰기 작업이 가능한 데이터베이스 작업을 하나 이상 포함하는 데이터베이스의 논리적 처리 단위
  • 작업이 성공하든 실패하든 부분적으로는 완료되지 않음

8.1.1 ACID 정의

  • Atomicity 원자성
    • 트랜잭션 내 모든 작업이 적용되거나 아무 작업도 적용되지 않도록 한다
    • 커밋 되거나 중단된다
  • Consistency 일관성
    • 트랜잭션이 성공하면 DB가 하나의 일관성 있는 상태에서 다음 일관성 있는 상태로 이동
  • Isolation 고립성
    • 여러 트랜잭션이 DB에서 동시에 실행되도록 허용하는 속성
    • 트랜잭션이 다른 트랜잭션의 부분 결과를 보지 않도록 보장
  • Durability 영속성
    • 트랜잭션이 커밋될 때 시스템 오류가 발생하더라도 모든 데이터가 유지

8.2 트랜잭션 사용법

코어 API 

  • 대부분의 오류에 재시도 로직을 제공하지 않으며
  • 개발자가 작업에 대한 로직, 트랜잭션 커밋 함수, 필요한 재시도 및 오류 로직을 모두 작성
//트랜잭션 시작
ClientSession session = mongoClient.startSession();
session.startTransaction();
//동작 수행
collection1.insertOne(session, document1);
collection2.updateOne(session, filter2, update2);
//커밋
session.commitTransaction();
//또는 롤백
session.abortTransaction();
//트랜잭션 종료
session.close();

콜백 API

  • 지정된 논리 세션과 관련된 트랜잭션 시작, 콜백 함수로 제공된 함수 실행, 트랜잭션 커밋 함수 등
  • 코어 API에 비해 많은 기능을 wrapping 하는 단일 함수를 제공
  • 커밋 오류를 처리하는 재시도 로직도 포함
//트랜잭션 옵션을 설정
TransactionOptions options = TransactionOptions.builder().readPreference(ReadPreference.primary()).build();

session.withTransaction(new TransactionBody<Void>() {	// 콜백 객체를 정의
    public Void execute() {
        // 트랜잭션 내에서 수행할 작업 정의
        collection1.insertOne(session, document1);
        collection2.updateOne(session, filter2, update2);
        // ...
        return null;
    }
}, options);

8.3 애플리케이션을 위한 트랜잭션 제한 조정

8.3.1 타이밍과 Oplog 크기 제한

시간 제한

  • 트랜잭션의 최대 실행 시간은 기본적으로 1분 이하
    • 시간이 경과하면 트랜잭션이 만료됐다고 간주하여 중단
  • 트랜잭션의 작업에 필요한 락을 획득하기 위해 트랜잭션이 대기하는 최대시간은 기본 5밀리세컨드
    • 시간 내에 락을 획득할 수 없으면 트랜잭션은 중단

Oplog 크기 제한

  • 트랜잭션의 쓰기 작업에 필요한 만큼 oplog 항목을 생성
  • 각 항목은 BSON 도큐먼트 크기 제한인 16메가바이트 이하
728x90
반응형

'DB > MongoDB' 카테고리의 다른 글

[MongoDB] 복제 셋 구성 요소  (0) 2023.07.27
[MongoDB] 복제 셋 설정  (0) 2023.07.11
[MongoDB] 애플리케이션 설계  (0) 2023.06.20
[MongoDB] 집계 프레임워크  (0) 2023.05.10
[MongoDB] 공간 정보 인덱스  (0) 2023.04.26
반응형
300x250