SQLiteはシングルコネクションDBではない
(igorstechnoclub.com)- SQLiteについて人々がよく誤解している点の一つは、「SQLiteは単一の接続しか許可しないデータベース」 だと考えて、使われなくなってしまうこと
- これは紛らわしくもあり(ここでいう「接続」とは何を意味するのか?)、さまざまな面で誤った主張でもある
- 読み取り処理 (Read Operations)
- SQLiteは複数の同時読み取り処理を完全にサポートしている
- 複数の「接続」から同時にデータを読み取ることができ、この過程で競合や問題は発生しない
- 書き込み処理 (Write Operations)
- SQLiteは書き込み時にDBレベルの書き込みロック (Write Lock) を使用する
- 同時に複数の書き込み処理は許可されず、そのため一度に書き込み処理を実行できる「接続」は1つだけである
- 一般的にこれが問題にならないのは、
IMMEDIATE TRANSACTIONを開始できるためである - この場合、SQLiteは書き込みロックを取得するためにキュー内で再試行できる
- (この方式では、書き込みロックが解放されると自動的に書き込み処理を実行できる)
1件のコメント
https://www.sqlite.org/lockingv3.html
5.0 データベースファイルへの書き込み
データベースに書き込むには、まず上で説明したとおり、プロセスが SHARED ロックを取得しなければなりません。SHARED ロックを取得した後は、RESERVED ロックを取得する必要があります。RESERVED ロックは、プロセスが将来のどこかの時点でデータベースに書き込むことを示すシグナルです。一度に RESERVED ロックを保持できるのは 1 つのプロセスだけです。しかし、他のプロセスは RESERVED ロックが保持されている間もデータベースを読み続けることができます。