Skip to content
Data
Skill

/mvcc

Overview of Experimental MVCC feature - snapshot isolation, versioning, limitations

From plugin
turso
24k13 skills
Install
$ npx -y skills add tursodatabase/turso --skill mvcc --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/mvcc

Context preview

The summary Claude sees to decide when to auto-load this skill.

Overview of Experimental MVCC feature - snapshot isolation, versioning, limitations

SKILL.md

mvcc.SKILL.md
name: mvcc
description: Overview of Experimental MVCC feature - snapshot isolation, versioning, limitations

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 visible
  • `end` - timestamp when deleted/replaced
  • `btree_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 overview
  • `core/mvcc/database/mod.rs` - Main implementation (~3000 lines)
  • `core/mvcc/cursor.rs` - Merged MVCC + B-tree cursor
  • `core/mvcc/persistent_storage/logical_log.rs` - Disk format
  • `core/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.rs` documents data anomalies (dirty reads, lost updates, etc.)
  • Snapshot isolation vs serializability: MVCC provides the former, not the latter
Read more
Ships withturso

A SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.

Get the whole plugin
Stats
23,793
Stars
1,250
Forks
Active
Maintenance
Rust
Language
MIT
License
1h ago
Last commit
2y ago
Created

Repo: tursodatabase/turso