[정리] Mongoose 쿼리별 트랜잭션 적용방법

2021. 3. 5. 14:55프로그래밍-Web/MongoDB

session을 공유하는 방법이 쿼리마다 조금씩 달라서 잠깐 정리

 

일단 하나의 세션을 여러개의 api에서 공유하기 위해서는 함수화가 필요하다.

예시의 경우에는 이전 포스팅에서 짜둔 useTransaction함수를 사용한다.

트랜젝션은 항상 세션을 시작시킨후, 그 세션에 해당하는 트랜젝션을 시작해주어야 한다.

또한 예시처럼 부모 리졸버와 자식 리졸버가 동일한 트랜잭션을 공유하길 원한다면 컨텍스트를 이용하여 세션을 넘겨준다.

따라서 다음과 같은 절차를 거쳐야한다

 

1) startSession을 통해 새로운 session객체 생성

2) ctx.session을 통해 1에서 생성한 세션을 정의

3) session객체에서 startTransaction으로 트랜잭션 실행

4) api 로직 수행

5) 트랜잭션 commit

 

이때 주의할점은 ctx에서 session객체를 전달했을지라도 API내에서 해당 session을 제대로 공유해야한다

그렇지 않으면 별도의 session을만들어 DB에 접근하므로 트랜젝션 처리가 되질 않는다.

 

예시에서는 모든 API가 session을 ctx에 의해 전달받는다.

 

aggregate를 사용하는 경우에는 option메소드로  session을 정의한다

 

반면 기존 쿼리는 세번째 args에 옵션으로 넣어준다. 이때 두번째 옵션은 건너뛰어지므로 null 을 입력해야한다.

 

단, bulkwrite는 두번째 옵션이므로 null이 필요없다.

이는 .save와 같은 cusor메소드도 마찬가지.