아래 코드에서 결제 취소가 중복으로 나가는 문제가 있습니다. 원인을 찾아주세요. 증상은 이렇습니다. 사용자가 취소 버튼을 빠르게 두 번 누르면 PG사에 취소 요청이 두 번 나가고, 두 번째 요청이 "이미 취소된 거래"라는 오류를 반환합니다. 그런데 그 오류가 사용자에게 그대로 노출돼서 취소가 실패한 것처럼 보입니다. 실제로는 첫 번째 요청이 성공했기 때문에 취소는 정상 처리된 상태입니다. ```javascript async function handleCancel(req, res) { const { orderId } = req.body; const order = await db.orders.findById(orderId); if (order.status === 'CANCELLED') { return res.json({ ok: true }); } const refund = await pg.refund({ transactionId: order.paymentId, amount: order.totalAmount, }); await db.orders.update(orderId, { status: 'CANCELLED' }); return res.json({ ok: true, refundId: refund.id }); } ``` 제 생각에는 `findById`로 상태를 읽는 시점과 `update`로 상태를 쓰는 시점 사이에 틈이 있어서, 두 요청이 모두 `status !== 'CANCELLED'` 조건을 통과하는 것 같습니다. 이런 경우 보통 어떻게 해결하나요? 낙관적 락을 쓰는 방법과, 주문 단위로 분산 락을 잡는 방법 중에 어느 쪽이 나을까요? 트래픽은 하루 3만 건 정도이고, 취소는 그중 2% 미만입니다. 데이터베이스는 PostgreSQL 16을 쓰고 있습니다.