[MongoDB] 안정성과 일관성을 위한 트랜잭션 가이드
KUKJIN LEE • 1개월 전 작성
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)이 발생해 성능 저하를 초래할 수 있습니다.