/note/tech

SQLite、複数クライアントからの同時書き込みを可能にする「BEGIN CONCURRENT」文を実装へ

SQLiteの開発チームは、複数クライアントからの同時書き込みを可能にするBEGIN CONCURRENT文を実装していることを明らかにしました。

同時書き込み処理は、データベースのジャーナルモードが「wal」(Write-Ahead-log)もしくはwalを改良した「wal2」で、BEGIN CONCURRENT文を実行した場合に可能となります。

アプリケーション開発者としてはこの同時書き込み機能を活用するために、できるだけトランザクションの衝突を起こさないように配慮するべきでしょう。

SQLiteでは、各テーブルと各インデックスは個別のb-treeとして格納され、それぞれが個別のデータベースページの集合に分散されているため以下の2つが言えると説明されています。

1)異なるテーブル・セットに書き込む2つのトランザクションが衝突することはない。

2)同じテーブルまたはインデックスに書き込む2つのトランザクションが衝突するのは、キー(主キーまたはインデックス行)の値がかなり近い場合だけである。

つまりテーブルが異なればページも異なるため、衝突することはなく、同じテーブルであってもキーの値が遠ければページが異なる可能性が高い、ということのようです。

SQLite 3での同時書き込みによるアプリケーションの高速化の恩恵を受けるために、今後はこれらを可能な範囲で配慮したデータベースのスキーマや格納する値などを慎重に設計するとよさそうです。

SQLiteみたいな歴史のあるプロダクトに抜本的な機能追加ができるのすごい。

SQLiteが単体で同時書き込みをサポートするならサーバレス環境での採用が増えそう。

サーバレスに限らず、シングルホストなシステムやラズパイみたいなシングルボードコンピュータでも使い道が開ける。