트랜잭션(Transaction)의 개념과 MongoDB에서의 활용
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
데이터 분석
대상자
MongoDB를 사용하는 개발자, 데이터베이스 운영자, 분산 시스템 설계자
난이도: 중급 (ACID 특성, 트랜잭션 처리, 제한사항 이해 필요)
핵심 요약
- 트랜잭션은 하나의 작업 단위로, 모든 연산이 성공해야 하거나 모두 실패해야 함 (예:
session.commit()
또는session.abortTransaction()
호출). - MongoDB는 다중 문서/컬렉션에 걸친 트랜잭션 지원 (MongoDB 4.2+), ACID 특성 보장.
- 제한사항으로는
admin
,local
,config
컬렉션 사용 금지, 분산 트랜잭션의 성능 최적화 필요.
섹션별 세부 요약
- 트랜잭션 정의
- 트랜잭션은 insert, update, delete, read 연산을 단위 작업으로 집합화.
- 아토믹성 보장: 하나의 연산 실패 시 전체 롤백.
- ACID 특성 지원 (Atomicity, Consistency, Isolation, Durability).
- 지원 연산 및 기능
- Aggregation (
$count
,$group
) 및 분산 트랜잭션 (Sharded Cluster) 지원. - 컬렉션/인덱스 생성 가능 조건:
readConcern: "local"
설정,admin
/system.*
컬렉션 제외. - 트랜잭션 내 제한사항:
capped
컬렉션에 쓰기 금지.$graphLookup
,distinct()
연산 사용 불가.- 병렬/멀티스레드 작업, 사용자 관리 명령어(
createUser
) 금지.
- 트랜잭션 생명주기 및 처리
- 세션(
session
)을 통해 트랜잭션 시작 및 종료. - 에러 발생 시 (
duplicate key
,TransientTransactionError
):session.abortTransaction()
호출. - 트랜잭션 수준에서 write concern, read concern 설정.
- 최적화 및 베스트 프랙티스
- 분산 트랜잭션은 성능/일관성 고려 필요.
- 트랜잭션 내 컬렉션 생성은 절대적으로 피해야 함 (성능 저하 유발).
- 트랜잭션 로직은
TransientTransactionError
등 일시적 오류에 대한 재시도 로직 포함.
- 코드 예시
```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 배포 환경을 확인한 후 사용.