Build the safeguards
Eight explained steps, tradeoffs, pitfalls and a checkpoint before moving on.
Read the tutorialComparison / Choose a boundary
A transaction keeps related database writes together. A guarded update protects availability. An idempotency key identifies a repeated decision. These mechanisms solve different parts of the same ordering problem.
This comparison separates the implementation pattern from the environment used to explore it. A general playground is useful for editing freely; this lab adds a fixed failure, a readable execution trace and a direct path from the result to its source.
| Approach | Useful when | Tradeoff | Connection to this lab |
|---|---|---|---|
| Guarded UPDATE | A single counter or availability rule can be expressed in one statement. | Check affected rows and keep dependent writes in a transaction. | The core inventory choice in this lab. |
| Pessimistic row locking | Several reads and writes require a consistent locked decision. | Lock ordering, wait times and deadlocks require real engine tests. | The MySQL companion introduces it; SQLite is not evidence for it. |
| Optimistic version checks | Conflicts are uncommon and callers can retry a versioned decision. | A conflict is a normal result that the application must handle. | A useful extension for quote editing, separate from the stock counter. |
| Outbox plus receiver inbox | A committed change must trigger work across a delivery boundary. | The receiver must define an idempotent effect; delivery may repeat. | Shown as local database behavior with no external sends. |
| WordPress Playground | Explore WordPress or use its open-source PHP.wasm building blocks. | A full WordPress installation serves a broader purpose than these SQL exercises. | This lab reuses the PHP runtime with a small, purpose-built application. |
| Disposable MySQL environment | Verify actual InnoDB concurrency and plans. | Requires a local runtime, more resources and explicit database isolation. | Use the download when you are ready to test beyond the browser. |
The browser executes actual PHP and SQLite through the open-source PHP.wasm runtime from WordPress Playground. Each run creates a new memory database. The last-item example replays a chosen stale-read order; it does not measure MySQL concurrency or InnoDB row locks.
Run the comparisonReferences support the language and runtime concepts. The lesson, scenarios and explanations are original Zyel Lab material.
Keep exploring
Eight explained steps, tradeoffs, pitfalls and a checkpoint before moving on.
Read the tutorialChoose a pattern and an environment for the problem you actually have.
Compare approachesA beginner route, a local setup and an extension challenge.
Open the how-to guide