mcpField
M
mvcc

mvcc

github.com/tursodatabaseデータ・データベース25.1k1.2k 回インストール今日更新
リポジトリ

mvcc について

mvccは、Tursoのマルチバージョン同時実行制御を解説する実験的なガイドです。MVCC固有の動作を開発・テストする人向けに、設定、行バージョン、構成、チェックポイント、現状の制限を説明します。

主な機能

  1. 01実行時のMVCC設定
  2. 02行バージョンとスナップショット
  3. 03MVCCストレージ構成
  4. 04チェックポイント処理
  5. 05実装上の既知の制限
  6. 06MVCC専用テストコマンド

活用シーン

  1. 01データベースでのMVCC有効化
  2. 02スナップショット分離動作の調査
  3. 03MVCC変更のテスト
  4. 04復旧とメモリの制限評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/tursodatabase/turso --skill mvcc

インストール後、Claude Code で/mvccを入力して読み込まれたか確認します。

詳細

MVCC ガイド(実験的)

マルチバージョン同時実行制御。開発中であり、本番環境での使用には対応していません。

重要:バグが MVCC 固有のものでない限り、デバッグ時は MVCC を無視してください。

MVCC の有効化

PRAGMA journal_mode = 'mvcc';

実行時の設定であり、コンパイル時の機能フラグではありません。データベースごとの設定です。

仕組み

標準の WAL:ページごとに単一のバージョンを保持し、読み取り時点の読み取りマークに対応するスナップショットを参照します。

MVCC:複数の行バージョンを保持し、スナップショット分離を行います。各トランザクションは開始時点の一貫したスナップショットを参照します。

WAL との主な違い
項目WALMVCC
書き込みの粒度コミットのたびにページ全体を書き込みます影響を受ける行のみ
読み取り/書き込み互いにブロックしません互いにブロックしません
永続化.db-wal.db-log(論理ログ)
分離レベルスナップショット(ページレベル)スナップショット(行レベル)
バージョン管理

各行バージョンは、次の情報を追跡します。

  • begin - 可視になった時点のタイムスタンプ
  • end - 削除または置換された時点のタイムスタンプ
  • btree_resident - MVCC の有効化前から存在していたかどうか

アーキテクチャ

Database
  └─ mv_store: MvStore
      ├─ rows: SkipMap<RowID, Vec<RowVersion>>
      ├─ txs: SkipMap<TxID, Transaction>
      ├─ Storage (.db-log file)
      └─ CheckpointStateMachine

接続ごと:mv_tx が現在の MVCC トランザクションを追跡します。

共有:ロックフリーの crossbeam_skiplist 構造を備えた MvStore。

主なファイル

  • core/mvcc/mod.rs - モジュールの概要
  • core/mvcc/database/mod.rs - 主な実装(約 3000 行)
  • core/mvcc/cursor.rs - MVCC と B-tree を統合したカーソル
  • core/mvcc/persistent_storage/logical_log.rs - ディスク形式
  • core/mvcc/database/checkpoint_state_machine.rs - チェックポイント処理

チェックポイント処理

行バージョンを定期的に B-tree にフラッシュします。

PRAGMA mvcc_checkpoint_threshold = <pages>;

処理の流れ:ロックを取得 → ページャートランザクションを開始 → 行を書き込み → コミット → ログを切り詰める → fsync → 解放。

現在の制限事項

未実装:

  • ガベージコレクション(古いバージョンが蓄積します)
  • 再起動時の論理ログからの復旧

既知の問題:

  • チェックポイント処理が、読み取りを含む他のトランザクションをブロックします。
  • ディスクへのスピルがないため、メモリ使用量に懸念があります。

テスト

# Run MVCC-specific tests
cargo test mvcc

# TCL tests with MVCC
make test-mvcc

MVCC を有効にしたテストでは、#[turso_macros::test(mvcc)] 属性を使用してください。

#[turso_macros::test(mvcc)]
fn test_something() {
    // runs with MVCC enabled
}

参考資料

  • core/mvcc/mod.rs に、データ異常(ダーティリード、更新消失など)が記載されています。
  • スナップショット分離と直列化可能性:MVCC が提供するのは前者であり、後者ではありません。

コメント