MongoDB 트랜잭션 개념과 ACID 특성 활용 가이드

트랜잭션(Transaction)의 개념과 MongoDB에서의 활용

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

데이터 분석

대상자

MongoDB를 사용하는 개발자, 데이터베이스 운영자, 분산 시스템 설계자

난이도: 중급 (ACID 특성, 트랜잭션 처리, 제한사항 이해 필요)

핵심 요약

  • 트랜잭션하나의 작업 단위로, 모든 연산이 성공해야 하거나 모두 실패해야 함 (예: session.commit() 또는 session.abortTransaction() 호출).
  • MongoDB는 다중 문서/컬렉션에 걸친 트랜잭션 지원 (MongoDB 4.2+), ACID 특성 보장.
  • 제한사항으로는 admin, local, config 컬렉션 사용 금지, 분산 트랜잭션의 성능 최적화 필요.

섹션별 세부 요약

  1. 트랜잭션 정의
  • 트랜잭션은 insert, update, delete, read 연산을 단위 작업으로 집합화.
  • 아토믹성 보장: 하나의 연산 실패 시 전체 롤백.
  • ACID 특성 지원 (Atomicity, Consistency, Isolation, Durability).
  1. 지원 연산 및 기능
  • Aggregation ($count, $group) 및 분산 트랜잭션 (Sharded Cluster) 지원.
  • 컬렉션/인덱스 생성 가능 조건: readConcern: "local" 설정, admin/system.* 컬렉션 제외.
  • 트랜잭션 내 제한사항:
  • capped 컬렉션에 쓰기 금지.
  • $graphLookup, distinct() 연산 사용 불가.
  • 병렬/멀티스레드 작업, 사용자 관리 명령어(createUser) 금지.
  1. 트랜잭션 생명주기 및 처리
  • 세션(session)을 통해 트랜잭션 시작 및 종료.
  • 에러 발생 시 (duplicate key, TransientTransactionError): session.abortTransaction() 호출.
  • 트랜잭션 수준에서 write concern, read concern 설정.
  1. 최적화 및 베스트 프랙티스
  • 분산 트랜잭션은 성능/일관성 고려 필요.
  • 트랜잭션 내 컬렉션 생성은 절대적으로 피해야 함 (성능 저하 유발).
  • 트랜잭션 로직TransientTransactionError 등 일시적 오류에 대한 재시도 로직 포함.
  1. 코드 예시

```javascript

const session = await mongoose.startSession();

try {

session.startTransaction();

await Order.create([{ userId: '123', amount: 500 }], { session });

await Inventory.updateOne({ item: 'book' }, { $inc: { stock: -1 } }, { session });

await session.commitTransaction();

console.log('Transaction committed.');

} catch (error) {

await session.abortTransaction();

console.error('Transaction aborted due to error:', error);

} finally {

session.endSession();

}

```

결론

MongoDB 트랜잭션을 사용할 때는 ACID 특성을 준수하고, 세션 기반 처리재시도 로직을 반드시 구현해야 함. 분산 트랜잭션은 성능 최적화와 Replica Set/Sharded Cluster 배포 환경을 확인한 후 사용.