mvcc▌
tursodatabase/turso · updated Apr 8, 2026
$22
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 | .db-wal |
.db-log (logical log) |
| Isolation | Snapshot (page-level) | Snapshot (row-level) |
Versioning
Each row version tracks:
begin- timestamp when visibleend- timestamp when deleted/replacedbtree_resident- existed before MVCC enabled
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
core/mvcc/mod.rs- Module overviewcore/mvcc/database/mod.rs- Main implementation (~3000 lines)core/mvcc/cursor.rs- Merged MVCC + B-tree cursorcore/mvcc/persistent_storage/logical_log.rs- Disk formatcore/mvcc/database/checkpoint_state_machine.rs- Checkpoint logic
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
core/mvcc/mod.rsdocuments data anomalies (dirty reads, lost updates, etc.)- Snapshot isolation vs serializability: MVCC provides the former, not the latter
Ratings
4.5★★★★★10 reviews- ★★★★★Shikha Mishra· Oct 10, 2024
mvcc is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
- ★★★★★Piyush G· Sep 9, 2024
Keeps context tight: mvcc is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Chaitanya Patil· Aug 8, 2024
Registry listing for mvcc matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Sakshi Patil· Jul 7, 2024
mvcc reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Ganesh Mohane· Jun 6, 2024
I recommend mvcc for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ★★★★★Oshnikdeep· May 5, 2024
Useful defaults in mvcc — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
- ★★★★★Dhruvi Jain· Apr 4, 2024
mvcc has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Rahul Santra· Mar 3, 2024
Solid pick for teams standardizing on skills: mvcc is focused, and the summary matches what you get after install.
- ★★★★★Pratham Ware· Feb 2, 2024
We added mvcc from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Yash Thakker· Jan 1, 2024
mvcc fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.