[정리] MongoDB의 Transaction과 session문제

2021. 2. 25. 14:46프로그래밍-Web/MongoDB

aggregate 쿼리에 session을 달아주지 않아 API가 서로 다른 트랜젝션에서 움직이는 문제가 생겼다.

 

기존 쿼리가 session객체를 쿼리 옵션에 실어서 주는 반면

 

aggregation은 전달하는 방법이 조금 다르다. option 메소드를 사용한다.

무튼 이건 그냥 실수. 중요한건 아니고.

 

 

<MongoDB의 Transaction과 Session>

 

트랜잭션은 논리적으로 하나의 작업으로 처리되는 쿼리들의 모음을 말한다

보통 commit과 rollback으로 나뉘어, 변경 후 상태를 유지하며 트랜잭션을 종료하거나, 이상이 있을 경우 이전 상태로 돌려놓은 후 트랜잭션을 종료한다

 

트랜잭션 과정에서는 '세션'이라는 개념을 사용하는데, 얘는 DB관련 작업을 수행 시작부터 종료까지의 기간을 말한다.

우리가 특정 쿼리를 DB에 보낸다면, DB 접속부터 수행한 후 쿼리 수행 및 종료가 될텐데, 이들은 하나의 세션안에서 실행되는 것이다. 또한 이 세션은 여러개의 트랜젝션을 가질 수 있다.

 

이때 특별한 처리가 필요한 트랜잭션은 Multi document에 대해 접근하는 경우이다. Single document에 접근하는 경우에는 몽고DB가 자체적으로 atomicity를 보장한다. 단, collection을 아예 새로 만들거나 index를 만드는 쿼리에 대해서는 트랜잭션 처리가 적용되지 않는다. 

 

트랜잭션을 처리하는 로직을 함수로 설정하였다. 

몽구스를 통해 session을 만들고, 이를 시작시킨 후 쿼리마다 session을 공유하면, 해당 작업은 하나의 세션에 속하게 된다. 이 session을 client session이라고 한다

실제로 session을 사용하기 위해서는, session을 필요한 쿼리 옵션에 담아 같은 session으로 묶는다.

트랜잭션은 commit과 rollback이 수행되는데, 특정 쿼리에서 rollback이 수행되는 상황이 되면, 같은 session의 쿼리는 모두 rollback된다.

 

graphql 리졸버가 여러 리졸버를 call하여 사용하는 경우, 동일한 session객체를 컨텍스트를 통해 공유할 수 있다.

이때 부모 리졸버에서 만든 session 객체를 ctx에 담아 주입해주어야 한다.

동일한 session을 공유받은 쿼리는 하나의 트랜젝션으로 묶인다.

따라서 commit과 rollback 중 하나가 일괄적으로 일어난다.