読者です 読者をやめる 読者になる 読者になる

SQLiteのロック・トランザクション関連仕様

DBのロック状態の種類:
(文中の「プロセス」は、正確には「プロセス、もしくはスレッド」を意味します。)

UNLOCKED ロックされていない状態。誰も読み書きしていない。DBの初期状態。
SHARED read可、write不可な状態。複数プロセスが同時にSHAREDロックを取得可能。複数プロセスが同時にreadできることを意味する。DBがこの状態にあるとき、他のプロセスからのwriteはもちろん不可。
RESERVED RESERVEDロックは、プロセスが将来writeを行う予定であるが、現時点ではreadだけを行っている状態である。SHAREDロックは複数プロセスが同時に取得することができるが、RESERVEDロックを取得できるのは1プロセスに限定される。PENDINGとは、新たにSHAREDロックを取得できる点が異なる(PENDINGでは新たにSHAREDを取得することはできない)。SQL実行におけるwrite処理がキャッシュ上で完結する場合は、このRESERVEDロック状態で実行される。
PENDING PENDINGロックは、既存のSHAREDロックの解放を待ち、EXCLUSIVEロックを取得してwriteを実行しようとしている状態である。PENDINGロック状態では新たなSHAREDロックの取得は許可されない。ただし、既存のSHAREDロックはそれが解放されるまでは有効。
EXCLUSIVE EXCLUSIVEロックはDBファイルへのwrite実行時に必要なロックである。EXCLUSIVEロックが有効になるのはDBファイルの中で1つだけであり、その他の全てのロックは解放された状態になる。SQLiteは並列処理性能を最大化する目的で、EXCLUSIVEロックの取得時間を最小にするよう動作する。


トランザクションのモード:

DEFERRED デフォルトはこのモード。トランザクションを開始した後でも、実際にDBに対するアクセスが発生するまではどのロックも取得しない。最初のread処理でSHAREDロックを取得し、最初のwrite処理でRESERVEDロックを取得する。カレントスレッドがトランザクションを開始した後に、別のスレッドが別のトランザクションを開始できるようにしている。
IMMEDIATE BEGIN TRANSACTION実行時にRESERVEDロックを取得する。あるdatabase connectionにおいてIMMEDIATEトランザクションを開始した後は、他のどのdatabase connectionも、DBへのwrite、IMMEDIATE/EXCLUSIVEトランザクションの開始はできなくなる。ただし、readは可能。
EXCLUSIVE BEGIN TRANSACTION実行時にEXCLUSIVEロックを取得する。EXCLUSIVEトランザクション開始後は、”read uncomitted” connectionを除く全てのdatabase connectionでreadが禁止される。また、EXCLUSIVEトランザクション、例外なく全てのdatabase connectionにおいてwriteが禁止される。


ネタ元