본문 바로가기
Back Side/DBMS > MongoDB

[MongoDB] Transaction 트랜잭션 개념부터 실습까지 (1) - Transaction numbers are only allowed on a replica set member or mongos

by developerBeluga 2022. 7. 1.
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 서버에서는 트랜잭션 적용이 불가능합니다.

 

출처: https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-implement-transactions

오직 Replica Set 환경에서만 동작하니 참고하시길 바랍니다!

 

 

그럼 다음에 Replica Set은 무엇이고 어떻게 프로젝트에 구성할 수 있는지 알아보도록 하겠습니다.

 

 

 

 

 

728x90
반응형

댓글