SW사관학교 정글7기 TIL (11/03)

c4fiber·2023년 11월 3일
0

SW사관학교 정글7기

목록 보기
27/49

mongoDB의 trigger는 transaction의 일부로 포함되는가?


mongoDB는 자체적으로 auto increment를 지원하지 않기 때문에 추가적인 컬렉션을 사용해서 구현해 줘야한다.
구현하는 방법에 대한 내용은 공식 페이지를 참조하도록 하자.

내가 가진 의문은 컬렉션 post에 document를 하나 집어넣고, trigger를 통해서 auto increment collection의 값을 하나 증가시켜주는식으로 작동한다.
과연 이 작업이 하나의 transaction으로 처리되는가? 라는 의문이 생겼다.

하나의 transaction으로 묶인다면 post.create()가 성공해도 trigger가 작동하지 않으면 (절반만 성공했을 때) rollback 되어 컬렉션 post에는 아무런 값이 없을 것이다.
그런데 trigger가 독립적으로 실행된다면? 그리고 이게 실패했다면?
다음 post.create() 작업에서 post_id 값이 충돌할 것이다

It sounds like you are asking what happens to a trigger if it is processing writes from a transaction and fails halfway through. If that is what you are asking, the answer is that the trigger has already fired for the first few events so there is no way for the system to roll back those events being seen

출처: https://www.mongodb.com/community/forums/t/using-triggers-and-transactions/233422


chat-gpt 번역내용
안녕하세요! 제가 이해한 바에 따르면, 여러분이 무엇을 달성하려고 하는지에 대해 좀 더 명확하게 설명해주셔야 하는 것 같습니다.

보시기에는 여러분이 트리거가 트랜잭션에서 쓰기 작업을 처리하다가 중간에 실패하는 경우에 대해 묻고 계신 것 같습니다. 이에 대한 답은 트리거가 이미 처음 몇 개의 이벤트에 대해 작동했으므로 시스템은 이러한 이벤트를 되돌릴 방법이 없습니다. 개발자 측에서는 변경 이벤트의 txnNumber 필드를 활용하고 함수 논리가 트랜잭션의 끝인지 중간인지를 판단하고 끝에서만 실행하도록하여 이 불변성을 유지할 수 있습니다.

또는, 여러분이 묻는 것이 트리거 함수 코드가 문서를 업데이트하기 위해 트랜잭션을 사용하고 해당 함수가 중간에 실패하는 경우에 대한 것이라면, 함수가 커밋 트랜잭션 명령을 내리지 않는 한 트랜잭션이 롤백될 것입니다 (이는 MongoDB가 처리하는 작업입니다).

이것이 여러분의 질문에 대한 답으로 이해될지 모릅니다.


부족한 영어실력으로 인해 뉘앙스를 정확하게 판단하지 못했지만... 정리해보자면

  1. Trigger가 여러 write 작업을 수행하는데 도중에 실패한다면? 돌릴 방법은 없다. 이미 앞에서 몇가지의 경우는 성공한 상태이기 때문에!

  2. Transaction의 일부로 trigger가 수행되었는데 이 작업이 실패하게 된다면? 전체 transaction이 rollback 되므로 이전상태로 돌아가게 된다. (이 작업은 mongoDB가 처리해준다.)

나의 경우가 1번인지, 2번인지 확인할 필요가 있다. auto increment를 위한 trigger가 어떻게 구성되어있는지 확인해야겠다.

profile
amazing idiot

0개의 댓글