The Transactional Outbox: Reliable Messaging Without Distributed Transactions
The made retries safe: when the same message arrives twice, the database refuses to act on it twice. That solves the consuming end. This post is about the producing end, and a problem that sounds…
Idempotency Is a Contract: Making Retries Safe from the Database Side
The closed out the first half of this series, the part of the contract you can see: column names, types, result-set shapes, the behavior of a single call. The rest of the series is about…
Proving the Contract Holds: Testing Database Code
The ended with a contract smoke test: a query that fails the build if a published view loses a promised column or changes a promised type. That test is worth having, and it is not…
Putting the Contract Under CI/CD: Database Deployments You Can Trust
So far in this series the database has a published interface (the ) and a read surface that you keep stable even when an wants to bind straight to your tables. Both of those are…
Reads Are Part of the Contract: A DBA’s Guide to ORM-Generated SQL
In I argued that the database is a published interface, and that the way to keep it changeable is to draw a boundary: a small, deliberate set of views and procedures is the contract, and…
Your Database Is an API: Treating the Schema as a Versioned Contract
A developer renames a column. The rename is clean, the build is green, the unit tests pass, and the pull request merges on a Tuesday afternoon. On Thursday a finance report that nobody on the…