• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

session.abortTransaction 명시

21.08.09 12:51 작성 조회수 182

1

안녕하세요, 선생님.

공부하다가 궁금한게 생겨서 질문드립니다.

transaction이 Atomicity를 유지할 수 있도록 abortTransaction을 쓰는 것 같은데, transaction의 에러 처리 부분에서 반드시 명시해줘야하는거죠?

혹시 {session}을 명시해준 mongoose api 중 하나라도 실패한다면 이전 것들이 자동으로 롤백되는 것이 아니라 abortTransaction을 명시해줘야 롤백되는건지 궁금합니다.

답변 1

답변을 작성해보세요.

0

daehyun님 안녕하세요 :)

abortTransaction을 하면 Transaction 내부에서 session을 포함한 모든 작업들은 롤백처리가 됩니다. 만약 mongoose operation이 실폐 이유가 일시적인 이유이면 재시도를 하게 될거에요. 그리고 정확하게는 transaction이 commit되기 전까지는 디비에 반영되지 않아요. Transaction 진행중일 때는 session이라는 별도 분리된  메모리에 문서들을 불러오고 쓰고 업데이트 등 작업들을 모두 처리합니다. 마지막에 transaction이 마무리되면서 session에 있던 변경 작업들이 모두 한번에 디비에 반영이 되요. session에 문서들이 불러져 있는 동안에는 해당 문서들이 변동될 수 있기 때문에 디비에 있는 해당 문서들은 락에 걸립니다. 다른 요청이 수정못하도록요. 따라서 엄밀하게 말하면 디비상으로는 롤백은 아니에요. session 상으로 임시로 불러온 문서들이 초기화되는겁니다.

daehyun님의 프로필

daehyun

질문자

2021.08.10

아하! 제가 롤백이라는 용어를 잘 알지 못해서 오해가 있었던 것 같습니다! 정정해주셔서 감사합니다. 덕분에 더 깊게 알아가는 것 같습니다.

commit되기 전까지 디비에 반영이 되지 않는다는 말은 저희가 굳이 오류가 발생해서 commit을 하지 못한다면 trycatch의 catch에서 abortTransaction 함수를 명시적으로 호출할 필요가 없다는 말씀이신군요!  자세하게 알려주셔서 감사합니다!