Production Database Engineering · Lesson 2

PostgreSQL and MySQL Storage Engines and MVCC Explained

Compare PostgreSQL tuple visibility and vacuum with MySQL 8.4 InnoDB undo and purge without inventing one shared engine model.

Quick answer

MVCC lets concurrent transactions reason from versions rather than forcing every reader behind every writer, but the physical representation, visibility rules, cleanup, and diagnostic evidence belong to the engine. The Spring order service can rely on documented transaction behavior; it must not assume PostgreSQL vacuum and InnoDB purge are interchangeable.

Learning objectives

  • Connect pages, indexes, buffers, logs, row versions, and cleanup to the order-service transaction boundary.
  • Diagnose long-lived visibility state with PostgreSQL 18 or MySQL 8.4 InnoDB evidence.

Prerequisites

Know transactions, primary keys, B-tree indexes, and the difference between application memory and durable storage.

Shared relational contract

Readers observe a transactionally valid view and writers create new durable state under an isolation contract. Long transactions can retain old versions, enlarge storage work, delay cleanup, and hold scarce sessions. An ORM entity is not the stored record, and a Java object version is not the engine’s MVCC identity.

The order service should keep transactions short, page large reports, close abandoned sessions, and separate remote calls from local locks. Capacity review must include version cleanup and storage headroom, not only query latency.

PostgreSQL 18 boundary

PostgreSQL keeps tuple versions with transaction visibility metadata. VACUUM makes space reusable and protects transaction ID safety; autovacuum policy and long-running snapshots influence cleanup. WAL supports crash recovery and replication but is not the tuple visibility store. Use pg_stat_activity, table statistics, vacuum progress, and documented transaction-age evidence with bounded query text.

MySQL 8.4 InnoDB boundary

InnoDB maintains clustered index records and uses undo information for consistent reads and rollback. Purge removes obsolete history when no active view needs it. Redo logging and binary logging serve different durability and replication roles. Use Performance Schema, InnoDB metrics, transaction views, and history evidence described by the 8.4 LTS manual.

Production failure scenario

A reporting request opens a transaction and remains idle while order updates continue. Storage grows and cleanup falls behind. First identify the session owner and business need. Cancel only through the incident procedure, then verify the application releases the connection and engine cleanup can progress. Do not call the incident resolved when the session disappears; verify storage, order latency, and durable outcomes.

Common misconceptions

  • MVCC does not mean writers never wait.
  • WAL and binlog are not generic synonyms.
  • Vacuum and purge are not identical operations.
  • Deleting rows does not guarantee immediate file shrinkage.

Decision checklist

  • Bound transaction and report duration.
  • Observe oldest transactions and retained history safely.
  • Size storage headroom for cleanup and recovery work.
  • Use the engine’s visibility and cleanup terminology.
  • Verify order correctness after terminating a session.

Review the systems boundary, continue to transactions, browse the course and topic, deepen with lock contention and long transactions, and connect to Spring Data JPA query performance.

Official sources

Knowledge check

Check your understanding

Answer both questions correctly to mark this lesson as mastered. You can retry without penalty.

1. A long order-report transaction coincides with growing obsolete-row storage; which diagnosis is defensible?

2. Can a clean SQL abstraction prove MVCC cleanup is healthy?