[참고자료]

https://medium.com/@marchpig/mongodb-multi-document-transactions-d51e047f811d

2 페이즈 커밋

https://trend21c.tistory.com/2155

https://rastalion.me/mongodb-transaction-management/

몽고db 4.X 버전부터 트랜잭션 기능을 지원함.

사실 트랜잭션은 원래 가능했으나, 이는 같은 도큐먼트 내에서만 가능한 single-documnet transaction 방식이었다.

→ 이렇게 해야 데이터 무결성이 보장되기 때문이다.

Relational 데이터 모델에서는 서로 관계가 있는 데이터들을 정규화하여 서로 다른 테이블에 저장하지만, Document 데이터 모델에서는 서로 관계가 있는 데이터들을 정규화하지 않고 하나의 Document에 저장을 하기 때문에

그러나 하나의 도큐먼트에서만 트랜잭션을 해도 괜찮은 이상적인 상황만 있는 것은 아니므로 이전에는 2-phase-commits와 같은 방법으로 개발자가 직접 처리해야했다.

→ 즉 데이터를 여러 도큐먼트에 수정하거나 써야 하는 상황에서

2-phase-commits

등장 배경으로는 하나의 도큐먼트는 원자성을 보장하지만, 여러 도큐먼드끼리는 원자성을 보장하지 않고, 각 도큐먼트는 내장된 도큐먼트가 있음으로 인해서 이들을 함께 트랜잭션하려면 매우 복잡했다.

아래와 같은 두가지 특성을 지키기가 어려우면서

  1. 원자성 :  if one operation fails, the previous operation within the transaction must “rollback” to the previous state (i.e. the “nothing,” in “all or nothing”)
  2. 일관성 : if a major failure (i.e. network, hardware) interrupts the transaction, the database must be able to recover a consistent state.