728x90
반응형
Transaction이란
예를 들어, 위 그림과 같이 4개의 데이터를 지운다고 과정을 하도록 하겠습니다.
순차적으로 작업을 하던 중 C에서 에러로 인해 데이터 삭제가 불가능한 상태가 되었습니다.
C,D는 데이터 삭제가 이루어지지 않았지만 C의 앞에 있던 A, B는 이미 데이터가 삭제된 상태죠.
이럴때 어떻게 해야할까요?
이처럼 트랜잭션은 복수개의 작업 중 한 개라도 실패하면 모두 실패로 간주하여 작업 전 상태로 돌아가게 합니다.
그럼 간단한 실습을 통해 트랜잭션을 좀 더 알아보도록 하겠습니다.
실습
export var exampleTransaction: RequestHandler = async (req, res) => {
// startSession() - 세션 생성
const session = await startSession();
try {
// withTransaction() - startTransaction()과 commitTransaction() 안써도 됨
await session.withTransaction(async () => {
// DB에 session 옵션 설정해주기
// 안해주면 안 먹힘
await Services.deleteOne({ groupId: req.params.id }).session(session);
const groupCheck = await Groups.findByIdAndDelete({ _id: req.params.id }).session(session);
console.log('groupCheck:', groupCheck);
if (!groupCheck) {
// abortTransaction() - 모든 작업을 rollback
await session.abortTransaction();
console.log('데이터가 없어요');
throw Error();
}
});
res.send('성공');
} catch (error: any) {
res.send('실패');
console.error(error.message);
} finally {
// endSession() - 세션 종료
session.endSession();
}
};
아주 간단하게 돌아가는 API를 작성해보았습니다.
현재 두개의 DB가 있고 Services 데이터가 삭제된 다음 Groups 또한 데이터가 삭제되는 구조입니다.
하지만 여기에서 Groups 데이터가 없다면 앞에서 업데이트가 된 Services는 원상복구가 되어야 합니다.
자, 한 번 실행시켜 볼까요?
Transaction numbers are only allowed on a replica set member or mongos
하지만 예상과 달리 처음보는 에러 메시지만 보입니다.
알고보니 일반적인 MongoDB 서버에서는 트랜잭션 적용이 불가능합니다.
오직 Replica Set 환경에서만 동작하니 참고하시길 바랍니다!
그럼 다음에 Replica Set은 무엇이고 어떻게 프로젝트에 구성할 수 있는지 알아보도록 하겠습니다.
728x90
반응형
'Back Side > DBMS > MongoDB' 카테고리의 다른 글
[MongoDB] Transaction 트랜잭션 개념부터 실습까지 (2) - 로컬에서 Replica Set 구성하기 (0) | 2022.07.12 |
---|---|
[MongoDB] Error: couldn't connect to server 127.0.0.1:27017 오류해결 (1) | 2022.07.08 |
[MongoDB] mongod.conf 설정 파일 찾기 - masOS의 경우 (0) | 2022.07.07 |
[MongoDB] lean() 메서드로 JavaScript Object 만들기 (0) | 2022.05.30 |
맥에서 Robo 3T '개발자를 확인할 수 없기 때문에' 해결방법 (0) | 2021.07.16 |
댓글