[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"glossary-transactional-outbox::en":3,"gloss-cluster-transactional-outbox::en":26,"gloss-next-transactional-outbox::en":9},{"slug":4,"category":5,"name":6,"definition":7,"meta_desc":8,"faq":9,"schema_markup":9,"related":10},"transactional-outbox","data-infra","Transactional Outbox","The transactional outbox is a pattern that solves a subtle but common bug: you update your database and publish an event, but those are two separate systems, so a crash between them leaves you with one and not the other. The fix is to write the event into an 'outbox' table inside the same database transaction as the business change. Either both commit or neither does.\n\nA separate process then reads unpublished rows from the outbox and delivers them to your message queue or event stream, marking each as sent. Change-data-capture tools reading the write-ahead log are a common way to do this step efficiently.\n\nFor SaaS builders, this is how you get reliable, atomic 'update-and-notify' without distributed transactions — critical when an order must always emit its 'order.created' event. Practical note: consumers must be idempotent, because the outbox guarantees at-least-once delivery, and the same event can arrive twice after a retry.","The transactional outbox writes an event into a table inside the same DB transaction as the business change, so a crash can't leave you with one and not the other.",null,[11,14,17,20,23],{"slug":12,"name":13},"change-data-capture","Change Data Capture (CDC)",{"slug":15,"name":16},"dead-letter-queue","Dead-Letter Queue (DLQ)",{"slug":18,"name":19},"delivery-semantics","Delivery Semantics",{"slug":21,"name":22},"message-queue","Message Queue",{"slug":24,"name":25},"write-ahead-log","Write-Ahead Log (WAL)",[27,31,34,37,40,44,47,50,51,54,58,61],{"slug":28,"category":5,"name":29,"updated_at":30},"acid","ACID","2026-08-24T02:46:37+00:00",{"slug":32,"category":5,"name":33,"updated_at":30},"ann-search","ANN Search",{"slug":35,"category":5,"name":36,"updated_at":30},"backpressure","Backpressure",{"slug":38,"category":5,"name":39,"updated_at":30},"batch-processing","Batch Processing",{"slug":41,"category":5,"name":42,"updated_at":43},"bm25","BM25","2026-08-24T02:46:38+00:00",{"slug":45,"category":5,"name":46,"updated_at":30},"cache","Cache",{"slug":48,"category":5,"name":49,"updated_at":30},"cap-theorem","CAP Theorem",{"slug":12,"category":5,"name":13,"updated_at":30},{"slug":52,"category":5,"name":53,"updated_at":30},"chroma","Chroma",{"slug":55,"category":5,"name":56,"updated_at":57},"chunk-overlap","Chunk Overlap","2026-08-24T03:30:02+00:00",{"slug":59,"category":5,"name":60,"updated_at":30},"columnar-storage","Columnar Storage",{"slug":62,"category":5,"name":63,"updated_at":30},"connection-pooling","Connection Pooling"]