[MongoDB] 안정성과 일관성을 위한 트랜잭션 가이드

KUKJIN LEE's profile picture

KUKJIN LEE2주 전 작성

1. 트랜잭션 API의 이해

MongoDB의 트랜잭션 API는 복수 문서와 컬렉션에 걸쳐 데이터 작업을 원자적으로 처리할 수 있습니다. 이는 데이터 일관성을 유지해야 하는 금융 애플리케이션이나 재고 관리 시스템에서 특히 유용합니다. 주요 트랜잭션 제어 메서드는 다음과 같습니다.

  • session.startTransaction(): 트랜잭션 시작

  • session.commitTransaction(): 트랜잭션 성공 시 커밋

  • session.abortTransaction(): 오류 발생 시 트랜잭션 중단

const { MongoClient } = require('mongodb');

async function runTransaction() {
    const uri = 'mongodb+srv://<your-connection-string>';
    const client = new MongoClient(uri);
    await client.connect();
    const session = client.startSession();

    try {
        session.startTransaction();
        const db = client.db('kakao');
        const collection = db.collection('uri');

        // 트랜잭션 내 여러 작업 실행
        await collection.insertOne({ name: 'Alice' }, { session });
        await collection.updateOne({ name: 'Alice' }, { $set: { age: 30 } }, { session });
        await collection.deleteOne({ name: 'Bob' }, { session });

        // 트랜잭션 커밋
        await session.commitTransaction();
        console.log('Transaction committed successfully');
    } catch (error) {
        // 에러 발생 시 롤백
        await session.abortTransaction();
        console.error('Transaction aborted:', error);
    } finally {
        await session.endSession();
        await client.close();
    }
}

runTransaction().catch(console.error);

 

2. 트랜잭션과 원자성

트랜잭션은 여러 문서와 컬렉션 작업을 원자적으로 수행할 수 있도록 보장합니다. 원자성(Atomicity)은 다음을 의미합니다. (정말 중요한 내용입니다.)

  • 모든 작업이 성공: 트랜잭션 내 모든 작업이 적용됩니다.

  • 모든 작업이 실패: 트랜잭션 내 작업이 실패하면 이전 상태로 복구됩니다.

 

3. 트랜잭션에서 수행할 수 있는 작업

MongoDB 트랜잭션은 대부분의 데이터베이스 작업을 지원합니다.

  • CRUD 작업: insertOne, updateOne, deleteOne 등.

  • 모든 작업은 session 객체와 함께 실행되어야 트랜잭션에 포함됩니다.

작업 중 오류가 발생하면, 트랜잭션 전체가 롤백되므로 데이터 일관성이 보장됩니다.

 

4. 트랜잭션과 세션

트랜잭션은 반드시 세션 내에서 실행되어야 합니다. 세션은 트랜잭션의 시작, 커밋, 중단을 관리하며 데이터 일관성을 유지하는 데 핵심 역할을 합니다.

  • client.startSession(): 세션 시작

  • session.endSession(): 작업 완료 후 세션 종료

 

5. 트랜잭션 설정: 읽기 및 쓰기 고려 사항

MongoDB 트랜잭션에서는 데이터 일관성을 보장하기 위해 읽기 및 쓰기 설정이 중요합니다.

5.1 읽기 우선순위 (Read Concern)

  • 읽기 작업의 데이터 일관성 수준을 결정합니다.

  • 일반적인 값: local(기본값), majority(다수 노드에서 확인된 데이터 읽기).

5.2 쓰기 우선순위 (Write Concern)

  • 트랜잭션 내 쓰기 작업의 안정성을 보장합니다.

  • 일반적인 값: { w: "majority" }(다수 노드에 쓰기 확인).

5.3 격리 수준 (Isolation Level)

  • 트랜잭션 내 작업 간의 데이터 충돌을 방지합니다.

  • MongoDB는 기본적으로 격리 수준을 관리하여 트랜잭션 내 일관성을 보장합니다.

 

6. 성능 고려 사항

트랜잭션은 다중 문서와 컬렉션 작업을 처리할 때 강력하지만, 성능에 약간의 영향을 미칠 수 있습니다.

  • 트랜잭션은 로그와 메타데이터를 추가적으로 기록하므로 오버헤드가 발생합니다.

  • 트랜잭션이 긴 시간 동안 열린 상태로 유지되면 데이터 잠금(lock)이 발생해 성능 저하를 초래할 수 있습니다.

New Tech Posts