mvcc について
mvccは、Tursoのマルチバージョン同時実行制御を解説する実験的なガイドです。MVCC固有の動作を開発・テストする人向けに、設定、行バージョン、構成、チェックポイント、現状の制限を説明します。
主な機能
- 01実行時のMVCC設定
- 02行バージョンとスナップショット
- 03MVCCストレージ構成
- 04チェックポイント処理
- 05実装上の既知の制限
- 06MVCC専用テストコマンド
活用シーン
- 01データベースでのMVCC有効化
- 02スナップショット分離動作の調査
- 03MVCC変更のテスト
- 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 との主な違い
| 項目 | WAL | MVCC |
|---|---|---|
| 書き込みの粒度 | コミットのたびにページ全体を書き込みます | 影響を受ける行のみ |
| 読み取り/書き込み | 互いにブロックしません | 互いにブロックしません |
| 永続化 | .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 が提供するのは前者であり、後者ではありません。
コメント
Markdown 対応