asyncfunctionupdateShipping(orderId: string,addr: Address,expectedVersion: number){constresult=awaitdb.query(`UPDATE orders
SET shipping = $1, version = version + 1
WHERE id = $2 AND version = $3`,[addr,orderId,expectedVersion]);if(result.rowCount===0){// 누군가 이미 수정했거나 주문이 없음
thrownewConflictError('Concurrent update detected — re-read and try again');}}
2. HTTP ETag
// GET — ETag 발급
app.get('/api/orders/:id',async(req,res)=>{constorder=awaitdb.findOrder(req.params.id);res.setHeader('ETag',`"${order.version}"`);res.json(order);});// PUT — If-Match 검증
app.put('/api/orders/:id',async(req,res)=>{constifMatch=req.header('If-Match');if(!ifMatch)returnres.status(428).json({error:'If-Match required'});constexpected=parseInt(ifMatch.replace(/"/g,''),10);try{awaitupdateShipping(req.params.id,req.body.shipping,expected);res.status(204).end();}catch(e){if(einstanceofConflictError)returnres.status(412).json({error:'Version mismatch'});throwe;}});