WEBBOOK CHAPTER

MongoDB 8.2, 입문에서 시니어까지: 31장. 동시 수정·Transaction 재현

31장. 동시 수정·Transaction 재현

같은 order를 두 client가 수정한다. 단순 $set으로는 마지막 write가 앞선 변경을 덮을 수 있다. version compare-and-set을 filter에 넣어 matchedCount 0을 conflict로 처리한다.


db.orders.updateOne(
  {_id:orderId,version:7,status:"CREATED"},
  {$set:{status:"PAID"},$inc:{version:1}}
)

multi-document transaction은 TransientTransactionError에 transaction body 전체를 재시도하고 UnknownTransactionCommitResult에 commit 결과를 확인하는 패턴을 driver 문서에 맞춘다. 외부 API는 transaction 안에 넣지 않는다.

재시도로 주문이 두 개 생기지 않게 idempotencyKey unique index와 business result lookup을 둔다. failpoint는 isolated test cluster에서만 쓰고 운영에서 실험하지 않는다.