MongoDB

[MongoDB] Ch8 - 트랜잭션

잭피 2022. 1. 4. 17:11

몽고DB는 여러 작업, 컬렉션, DB, 도큐먼트 및 샤드에서 ACID 호환 트랜잭션을 지원한다

8.1 트랜잭션 소개

트랜잭션은 읽기나 쓰기 작업이 가능한 데이터베이스 작업을 하나 이상 포함하는 데이터베이스의 논리적 처리 단위다

트랜잭션의 중요한 특징은 작업이 성공하든 실패하든 부분적으로는 완료되지 않는다는 점이다

트랜잭션을 사용하려면 몽고DB 버전 4.2 이상이어야 한다

1. ACID의 정의

‘진정한’ 트랜잭션이 되려면 ACID라는 속성을 충족해야 한다

원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 영속성(Durablity)의 약어다

ACID 트랜잭션은 정전 등 오류가 발생할 때도 데이터와 데이터베이스 상태의 유효성을 보장한다

원자성(Atomicity)

트랜잭션 내 모든 작업이 적용되거나 아무 작업도 적용되지 않도록 한다

즉, 부분적으로 적용될 수 없다

일관성(Consistency)

트랜잭션이 성공하면 데이터베이스가 하나의 일관성 있는 상태에서 다음 일관성 있는 상태로 이동하도록 한다

고립성(Isolation)

여러 트랜잭션이 데이터베이스에서 동시에 실행하도록 허용하는 속성이다

트랜잭션이 다른 트랜잭션의 부분 결과를 보지 않도록 보장한다

영속성(Durablity)

트랜잭션이 커밋될 때 시스템 오류가 발생하더라도 모든 데이터가 유지되도록 한다

2. 트랜잭션 사용법

몽고DB는 트랜잭션을 사용하기 위한 두 가지 API를 제공한다

(1) 코어 API

관계형 데이터베이스와 유사한 구문이다

대부분 오류에 재시도 로직을 제공하지 않으며 개발자가 작업에 대한 로직, 트랜잭션 커밋 함수, 필요한 재시도 및 오류 로직을 모두 작성해야 한다

(2) 콜백 API

트랜잭션 사용에 권장되는 접근 방식이다

지정된 논리 세션과 관련된 트랜잭션 시작, 콜백 함수로 제공된 함수 실행, 트랜잭션 커밋(또는 오류 시 중단)을 포함해 코어 API에 비해 많은 기능을 래핑하는 단일 함수를 제공한다

커밋 오류를 처리하는 재시도 로직도 포함된다

콜백 API는 몽고DB 4.2에 추가돼 트랜잭션을 통해 애플리케이션 개발을 단순화한다

두 API에서 개발자는 트랜잭션에서 사용할 논리 세션을 시작해야 하며, 트랜잭션의 작업이 특정 논리 세션과 연결돼야 한다

몽고DB 논리 세션은 전체 몽고DB 배포 컨텍스트에서 작업의 시간과 순서를 추적한다

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

트랜잭션을 사용할 때 알아야 할 몇 가지 매개변수가 있다

애플리케이션이 트랜잭션을 최적으로 사용하도록 매개변수를 조정하자

1. 타이밍과 Oplog 크기 제한

몽고DB 트랜잭션에는 두 가지 주요 제한 범주가 있다

(1) 시간 제한

특정 트랜잭션이 실행될 수 있는 시간, 트랜잭션이 락을 획득하려고 대기하는 시간, 모든 트랜잭션이 실행될 최대 길이를 제어하는 것과 관련 있다

트랜잭션의 최대 실행 시간은 기본적으로 1분 이하이다

mongod 인스턴스 레벨에서 transactionLifeTimeLimitSeconds에 의해 제어되는 제한을 수정해 증가시킬 수 있다

트랜잭션에 시간 제한을 명시적으로 설정하려면 commitTransaction에 maxTimeMS를 지정하는 것이 좋다

maxTimeMS를 설정하지 않으면 transactionLifetiemLimitSeconds가 사용된다

maxTimeMS를 설정했는데, transactionLifetiemLimitSeconds를 초과하면 transactionLifetiemLimitSeconds가 사용된다

트랜잭션 작업에 필요한 락을 획득하기 위해 트랜잭션이 대기하는 최대 시간은 기본적으로 5ms이다

이 값은 maxTransactionLockRequestTimeoutMillis에 의해 제어되는 제한을 수정해 늘릴 수 있다

이 시간 내에 락을 획득할 수 없으면 트랜잭션은 중단된다

(2) Oplog 크기 제한

몽고DB는 트랜잭션의 쓰기 작업에 필요한 만큼 oplog 항목을 생성한다

그러나 각 oplog 항목은 BSON 도큐먼트 크기 제한인 16메가바이트 이하여야 한다

유연성 있는 모델과 스키마 설계 패턴과 같은 모범 사례를 사용하면 대부분 상황에서 트랜잭션을 사용하지 않아도 된다. 따라서 트랜잭션은 애플리케이션에서 드물게 사용하는 것이 좋은 강력한 기능이다