同時実行制御
URL: https://www.kkaneko.jp/tools/sqlitedb/10.html
SQLite 3 のロック
SQLite 3 の同時実行制御は,データベースファイル単位のロックで行われる. 既定のロールバックジャーナルモードでは,ロックの状態は UNLOCKED, SHARED, RESERVED, PENDING, EXCLUSIVE の 5 つである.
- データの読み出しには SHARED ロックが必要である.SHARED ロックは複数同時に取得できるので,複数の読み手が同時に読める.
- データの書き込みには EXCLUSIVE ロックが必要である.EXCLUSIVE ロックは他のロックと同時に存在できないので,書き手は同時に 1 つだけである.
ロックが取得できないとき,SQLite 3 は SQLITE_BUSY を返す. 待ち時間はミリ秒単位で設定できる.
PRAGMA busy_timeout = 5000;
WAL モード
WAL (write-ahead log) モードでは,変更が別のログファイルに追記される. そのため,読み手と 1 つの書き手が同時に動作できる.読み手は書き手をブロックせず,書き手は読み手をブロックしない.
PRAGMA journal_mode = WAL;
* WAL モードの設定はデータベースファイルに保存されるので,接続ごとに指定する必要はない.
トランザクションの種類
- BEGIN DEFERRED: 既定値.最初の読み書きが行われるまでロックを取得しない.
- BEGIN IMMEDIATE: 開始時に書き込み用のロックを取得する.
- BEGIN EXCLUSIVE: 開始時に排他ロックを取得する.
【参考】
- ロックと同時実行制御: https://www.sqlite.org/lockingv3.html
- WAL モード: https://www.sqlite.org/wal.html