Pgmicro mvcc
Overview of Experimental MVCC feature - snapshot isolation, versioning, limitations
install
source · Clone the upstream repo
git clone https://github.com/glommer/pgmicro
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/glommer/pgmicro "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/mvcc" ~/.claude/skills/glommer-pgmicro-mvcc && rm -rf "$T"
manifest:
.claude/skills/mvcc/SKILL.mdsource content
MVCC Guide (Experimental)
Multi-Version Concurrency Control. Work in progress, not production-ready.
CRITICAL: Ignore MVCC when debugging unless the bug is MVCC-specific.
Enabling MVCC
PRAGMA journal_mode = 'mvcc';
Runtime configuration, not a compile-time feature flag. Per-database setting.
How It Works
Standard WAL: single version per page, readers see snapshot at read mark time.
MVCC: multiple row versions, snapshot isolation. Each transaction sees consistent snapshot at begin time.
Key Differences from WAL
| Aspect | WAL | MVCC |
|---|---|---|
| Write granularity | Every commit writes full pages | Affected rows only |
| Readers/Writers | Don't block each other | Don't block each other |
| Persistence | | (logical log) |
| Isolation | Snapshot (page-level) | Snapshot (row-level) |
Versioning
Each row version tracks:
- timestamp when visiblebegin
- timestamp when deleted/replacedend
- existed before MVCC enabledbtree_resident
Architecture
Database └─ mv_store: MvStore ├─ rows: SkipMap<RowID, Vec<RowVersion>> ├─ txs: SkipMap<TxID, Transaction> ├─ Storage (.db-log file) └─ CheckpointStateMachine
Per-connection:
mv_tx tracks current MVCC transaction.
Shared:
MvStore with lock-free crossbeam_skiplist structures.
Key Files
- Module overviewcore/mvcc/mod.rs
- Main implementation (~3000 lines)core/mvcc/database/mod.rs
- Merged MVCC + B-tree cursorcore/mvcc/cursor.rs
- Disk formatcore/mvcc/persistent_storage/logical_log.rs
- Checkpoint logiccore/mvcc/database/checkpoint_state_machine.rs
Checkpointing
Flushes row versions to B-tree periodically.
PRAGMA mvcc_checkpoint_threshold = <pages>;
Process: acquire lock → begin pager txn → write rows → commit → truncate log → fsync → release.
Current Limitations
Not implemented:
- Garbage collection (old versions accumulate)
- Recovery from logical log on restart
Known issues:
- Checkpoint blocks other transactions, even reads!
- No spilling to disk; memory use concerns
Testing
# Run MVCC-specific tests cargo test mvcc # TCL tests with MVCC make test-mvcc
Use
#[turso_macros::test(mvcc)] attribute for MVCC-enabled tests.
#[turso_macros::test(mvcc)] fn test_something() { // runs with MVCC enabled }
References
documents data anomalies (dirty reads, lost updates, etc.)core/mvcc/mod.rs- Snapshot isolation vs serializability: MVCC provides the former, not the latter