Project: Seat Booking with DynamoDB Transactions
Projects prove transactions. Lagos events lead Chioma Adeyemi and Pune founder Vikram Patil ship SeatHold: FREE→HELD→SOLD with TransactWriteItems, ClientRequestToken, and hold TTL. Reuse transactions; link CRUD for Put syntax — do not rewrite it.
What you'll learn in this chapter
- Model seat + order keys
- Hold a seat with TransactWrite + condition
- Use ClientRequestToken for idempotency
- Release abandoned holds with TTL
- Lab + cleanup
1. Everyday example: cinema counter slip
Counter holds a seat slip for 10 minutes while you pay. Two cashiers must not sell A12 twice. That is TransactWrite with Status=FREE condition + a hold timer (TTL).
2. Vertical steps
3. Why do we need this?
Why do we need this?
Partial success (seat held, order missing) creates double-books and angry queues. Interviews and MNC tickets ask how you make multi-item booking atomic.
4. What is it?
What is it?
SeatHold single-table: PK=EVENT#id SK=SEAT#row-num (Status, Version, HoldUser, HoldExpires); PK=ORDER#id SK=META. TransactWrite: condition FREE→HELD + Put ORDER. Pay: HELD→SOLD + ORDER PAID. Abandon: TTL or release→FREE.
5. How to do it (step by step)
How to do it (step by step)
- List 6 access patterns (list free seats, hold, pay, my orders…).
- Draw sample EVENT#9 SEAT#A-12 + ORDER#o1 items.
- Create lab-ddm-seats; Put 5 FREE seats.
- TransactWrite hold with Condition Status=FREE and ClientRequestToken.
- Second client same seat must cancel — read CancellationReasons.
- Short HoldExpires TTL; pay path TransactWrite SOLD; delete table.
6. Key sketch
| Entity | PK | SK |
|---|---|---|
| Seat | EVENT#9 | SEAT#A-12 |
| Order meta | ORDER#o1 | META |
| My orders GSI | USER#u1 | ORDER#ts |
7. Commands with output and meaning
aws dynamodb create-table --table-name lab-ddm-seats \
--attribute-definitions AttributeName=PK,AttributeType=S AttributeName=SK,AttributeType=S \
--key-schema AttributeName=PK,KeyType=HASH AttributeName=SK,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST --region ap-south-1
# Hold (SDK preferred). CLI sketch:
aws dynamodb transact-write-items --client-request-token book-o1-u1 --transact-items '[
{"Update":{"TableName":"lab-ddm-seats","Key":{"PK":{"S":"EVENT#9"},"SK":{"S":"SEAT#A-12"}},
"ConditionExpression":"#S = :free","UpdateExpression":"SET #S = :held, HoldUser = :u, HoldExpires = :t ADD Version :one",
"ExpressionAttributeNames":{"#S":"Status"},
"ExpressionAttributeValues":{":free":{"S":"FREE"},":held":{"S":"HELD"},":u":{"S":"u1"},":t":{"N":"1730003600"},":one":{"N":"1"}}}},
{"Put":{"TableName":"lab-ddm-seats","Item":{"PK":{"S":"ORDER#o1"},"SK":{"S":"META"},"Seat":{"S":"A-12"},"Status":{"S":"PENDING"}}}}
]'
# Output: {} on success. Cancelled = read CancellationReasons. Meaning: atomic hold+order.
On-demand table; condition FREE; ClientRequestToken stops double-submit. Link transactions chapter for SDK details.
8. Industry stories
- Entertainment (Chioma): zone-sharded EVENT#id#zone for opening night.
- Airlines (Omar): seat + bag add-on in one txn.
- Healthcare (Meera): clinic slot hold + patient note.
- Education (Sofia): exam hall seats.
- Retail (Aisha): flash SKU reservation.
- Gov (Priya): passport appointment counters.
9. Lab
How to do it (step by step)
- Patterns + draw + create lab-ddm-seats with 5 FREE seats.
- Hold A-12; second hold fails; retry same ClientRequestToken safely.
- Enable TTL on HoldExpires; pay txn or release; delete table.
Cleanup (stop billing)
- Delete lab resources you created.
- Confirm with describe that names are gone.
10. Ops checklist before you ship
- Confirm TTL attribute name and units (epoch seconds).
- Decide soft-delete vs hard-delete vs archive-to-S3.
- Enable PITR on any table you cannot rebuild from source.
- Document RPO/RTO and who runs restore drills.
- If multi-region: pick write stickiness and conflict rules.
- If DAX: prove cache-miss path and warm-up plan.
- Tag Owner + Expiry on every lab resource.
- Budget alert in the account before load tests.
11. Copy-paste DynamoDB CLI starters (batch 2)
export AWS_DEFAULT_REGION=ap-south-1
# TTL status
aws dynamodb describe-time-to-live --table-name ShopApp
# PITR / continuous backups
aws dynamodb describe-continuous-backups --table-name ShopApp
# On-demand backup
aws dynamodb create-backup --table-name ShopApp --backup-name lab-shop-$(date +%Y%m%d)
# List backups
aws dynamodb list-backups --table-name ShopApp
# Global table description (v2)
aws dynamodb describe-table --table-name ShopApp --query 'Table.Replicas'
12. More industry stories
- Retail (Aisha Khan, Dubai): TTL clears abandoned carts; soft-delete keeps 30-day undo.
- Bank (Lucas Meyer, Berlin): PITR on ledger table; restore drill every quarter.
- Travel (Omar Haddad, Amman): Global Tables for catalog reads; inventory writes sticky.
- Gaming (Carlos Rivera, Mexico City): DAX for hot profile Gets; never cache money ledgers.
- Social (Priya Nair, Kochi): adjacency edges for follows; sparse GSI for unread inbox.
- IoT (Mei Lin, Shenzhen): device#day PK + TTL 14 days; rollups to S3.
13. Glossary (batch 2)
| Term | Meaning |
|---|---|
| TTL | Time to Live — attribute with epoch seconds; DynamoDB deletes later |
| Soft delete | Flag deleted=true; item remains until TTL/archive |
| PITR | Point-in-time recovery — continuous backups window |
| Global Table | Multi-region replicated DynamoDB table |
| LWW | Last-writer-wins conflict resolution on replicas |
| DAX | DynamoDB Accelerator — in-memory cache cluster |
| Adjacency list | Edge items modeling relationships in one table |
| Fan-out | Write once; push copies to many feeds/inboxes |
14. Practice: explain out loud
- 60s: TTL vs soft-delete vs S3 archive.
- 60s: PITR vs on-demand backup.
- 60s: when Global Tables help and hurt.
- 60s: DAX consistency trade-off.
- 60s: CartLite checkout keys in one breath.
- 60s: follow edge vs feed item.
- Record once; cut filler; record again.
15. Safe lab hygiene
- Use ap-south-1 labs with a budget alert.
- Prefix lab tables with lab- and your initials.
- Delete replicas, DAX clusters, and backups you created for labs.
- Never enable Global Tables on production without a write plan.
- Tag every resource Owner + Expiry.
- Export/import labs can create large S3 bills — delete prefixes.
16. How this set links other chapters
- Data modeling — keys we reuse in projects.
- Transactions — checkout and seat patterns.
- Streams + Lambda — fan-out and CDC.
- CRUD survey — short TTL note we deepen.
- What Is DynamoDB? — intro.
17. Delete / archive decision pad
| Need | Prefer | Why |
|---|---|---|
| Undo 7-30 days | Soft-delete flag | User restore |
| Hard expiry, no read | TTL attribute | Auto delete later |
| Compliance keep cold | Export/archive to S3 | Cheap long store |
| Mistake recovery | PITR / backup | Table-level restore |
18. Ten oral drill questions
- What units does DynamoDB TTL use?
- Does TTL delete instantly?
- PITR window typical length?
- Global Tables conflict default?
- When sticky writes matter?
- DAX vs API Gateway cache?
- Cart PK for a shopper?
- Order lines under which PK?
- Follow edge SK example?
- Unread inbox sparse GSI idea?
19. RPO / RTO mini workshop
- Write the worst data loss you can accept (RPO) in minutes.
- Write how long restore may take (RTO) before business pain.
- Map: on-demand backup vs PITR vs multi-region replica.
- Schedule a restore drill on a lab table this month.
- Name the person who runs the drill.
20. Cost watch list (batch 2)
- PITR storage and on-demand backup storage.
- Global Tables: replicated WCUs in every region.
- DAX node hours even at idle.
- Export to S3 + S3 storage + Athena later.
- Streams + Lambda still bill during TTL deletes.
21. Project Definition of Done
- Access patterns written and peer-reviewed.
- Sample items drawn for happy path + one failure.
- Lab table created, exercised, deleted (or tagged Expiry).
- At least one conditional write or transaction exercised.
- Cleanup commands pasted in your notes.
- One interview answer recorded out loud.
22. Cross-links inside this batch
- TTL hygiene → Backup/PITR for “oops” recovery.
- Global Tables → sticky writes from capacity/hot lessons.
- DAX → only after Query shapes are correct.
- P1 CartLite reuses modeling + transactions.
- P2 Social reuses adjacency + Streams ideas.
23. Quick self-check (yes/no)
- I can explain TTL delay vs instant DeleteItem.
- I know when soft-delete beats hard delete.
- I can start PITR and say what restore costs in time.
- I can name one reason NOT to use Global Tables.
- I know DAX does not fix a bad partition key.
- I can sketch CartLite USER# and ORD# keys.
- I can sketch a follow edge item.
- I delete lab replicas/DAX/backups the same day.
24. Common errors and fixes
Each row is a real mistake students and juniors hit. Read the fix before you panic.
| Error / symptom | Fix |
|---|---|
| TransactionCanceledException | Read CancellationReasons; refresh seat. |
| Blind hold without condition | Condition Status=FREE. |
| Reuse token with new payload | New ClientRequestToken per booking. |
| Hot EVENT# partition | Shard by zone / on-demand. |
| Hold forever | HoldExpires TTL or release path. |
| Partial Put seat then order | One TransactWrite. |
| Rewrite Put chapter here | Link CRUD. |
| Leave lab table | Delete same day. |
| Ignore Version | ADD Version on hold/pay. |
25. Troubleshooting checklist
- Cancel on hold: seat already HELD/SOLD — offer neighbors.
- IdempotentParameterMismatch: new token.
- Throttle opening night: shard EVENT# + on-demand.
- TTL not deleting: attr must be Number epoch seconds.
- Need strong read before UI: TransactGetItems / consistent Get.
26. FAQ
Q. Should I always use a single table?
Often yes for related access patterns; not a religion. Separate tables are fine for unrelated domains or different capacity/security needs.
Q. Do I still need RDS?
Yes for heavy joins, multi-row SQL reports, and strong relational constraints. See the intro DynamoDB vs RDS chapter.
Q. Is Scan evil?
Scan is a tool for rare admin jobs and small tables. Design so hot paths use Query/GetItem.
Q. Where are Put/Get command details?
In the CRUD survey, CLI and SDK chapters — this deep set links them instead of copying.
Q. Optimistic locking enough?
One item yes; seat+order needs TransactWrite.
Q. TransactGetItems?
Consistent multi-item read before checkout UI.
Q. Payment fails after hold?
TTL/Step Functions release to FREE.
Q. Max actions?
≤100 per transaction.
27. Interview Q&A
Q. (B) Stop double-book?
TransactWrite condition FREE→HELD + order.
Q. (B) Idempotency?
ClientRequestToken.
Q. (M) Payment fail?
TTL/compensate release.
Q. (M) CancellationReasons?
Per-item why txn cancelled.
Q. (S/MNC) Opening-night heat?
On-demand + zone shards + sticky UX.
Q. (MNC) Seat vs inventory service?
Same txn across tables or single-table both types.
28. Tips in English, Marathi and Hindi
Ravindra Bagale's Tip (EN)
Atomic hold+order with a condition — never two lonely Puts.
Ravindra Bagale's Tip (MR)
Hold+order एका txn मध्ये; condition विसरायचं नाही.
Tip (HI)
होल्ड और ऑर्डर एक ट्रांज़ैक्शन में — अकेले Put नहीं।
Try at home
- Draw FREE/HELD/SOLD state machine.
- Lab hold + conflict.
- Write pay + release bullet list.
In short
- SeatHold = EVENT# seats + ORDER#.
- TransactWrite + FREE condition.
- Token + hold TTL.
- Cleanup labs.
Revision, interview and comparison cards
Revise this lesson in a few minutes. Save the cards on your phone or download them as PNG files. The QR code on each card opens this lesson.








More cards: Ravi Sir's Cards.
Practice Tasks
Maple Leaf Books is a bookselling business in Toronto. Emily Tremblay looks after its IT and cloud work. They count money in CAD and run their AWS resources in the ca-central-1 Region. In the tasks below you do real jobs for them using what this lesson teaches. All names, account IDs, IP addresses and numbers are made up for practice.
0 / 16
Easy Hold uses TransactWrite — 1
Why: Atomic.
What to do: Enter 1 if seat hold uses TransactWriteItems.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Easy Condition Status=FREE — 1
Why: Condition.
What to do: Enter 1 if hold conditions on Status=FREE.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Easy ClientRequestToken idempotency — 1
Why: Retry.
What to do: Enter 1 if ClientRequestToken makes retries safe.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Easy HoldExpires uses TTL — 1
Why: Abandon.
What to do: Enter 1 if abandoned holds can use HoldExpires TTL.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Easy Describe seats table
Why: CLI.
What to do: Describe table ShopApp
- Read the task and decide which AWS service it is about.
- Write aws, then the service name, then the operation (the action word).
- Add each needed flag (--name) followed by its value from the task.
- Flags can be in any order. Click Check answer.
Easy Seat states YAML
Why: Machine.
What to do: YAML: free: FREE, held: HELD, sold: SOLD.
- Start from the top-level keys the task names.
- Indent child keys with 2 spaces (no tabs).
- Fill in each property with the value from the task.
- Click Check answer. Key order does not matter.
Easy Release on pay fail — 1
Why: Compensate.
What to do: Enter 1 if payment failure should release hold to FREE.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Medium Read CancellationReasons — 1
Why: Debug.
What to do: Enter 1 if cancelled txns need CancellationReasons.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Medium PK EVENT# SK SEAT# — 1
Why: Model.
What to do: Enter 1 if seats use EVENT# / SEAT# keys.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Medium Pay path HELD to SOLD — 1
Why: Flow.
What to do: Enter 1 if payment success sets HELD→SOLD in a txn.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Medium Optimistic alone not enough — 1
Why: Scope.
What to do: Enter 1 if seat+order needs multi-item txn not only one-item optimistic lock.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Medium Hold flow YAML
Why: Steps.
What to do: YAML: condition: FREE, write: order.
- Start from the top-level keys the task names.
- Indent child keys with 2 spaces (no tabs).
- Fill in each property with the value from the task.
- Click Check answer. Key order does not matter.
Hard Shard hot events — 1
Why: Scale.
What to do: Enter 1 if opening-night heat needs zone shards / on-demand.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Hard Max 100 txn actions — 1
Why: Limit.
What to do: Enter 1 if a transaction allows at most 100 actions.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Hard Delete lab same day — 1
Why: Hygiene.
What to do: Enter 1 if lab-ddm-seats should be deleted same day.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.
Hard Link transactions chapter — 1
Why: Reuse.
What to do: Enter 1 if this project links the transactions chapter instead of rewriting Put.
- Write down the numbers the task gives you.
- Work it out step by step on paper.
- Type only the final answer in the box.
- Click Check answer.