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에서만 쓰고 운영에서 실험하지 않는다.