SQLiteのロールバックジャーナルファイル
トランザクション更新処理を開始すると、トランザクションをロールバックするための
ジャーナルファイルが作成されます。
ジャーナルファイルは「データベース名-journal」という名前で作成されます。
# ジャーナルファイルは、データ更新中に外部からの参照アクセスへ応答するための
# 元データとしても使用されます。
アプリ実行中等にアプリデータ領域のdatabasesフォルダを見てみます。
root@android:/data/data/yuki.test/databases # ls -l ls -l -rw-rw---- app_145 app_145 5120 1980-01-06 05:34 test.db -rw-r--r-- app_145 app_145 0 1980-01-06 05:34 test.db-journal
test.db-journalというファイルが作成されていますね。
トランザクションをコミットしたりロールバックすると、このファイルは削除あるいは無効
となります。
場合によっては、ジャーナルファイルの削除がパフォーマンスに悪影響を及ぼすケースが
あります。
そのため、ジャーナルファイルの削除には複数のモードが用意されています。
※Androidアプリがジャーナルモードを指定できるかは未調査
データベースのジャーナルモードを調べてみます。
調べたいデータベースをsqlite3シェルモードで開き、下記コマンドを発行します。
sqlite> PRAGMA journal_mode; PRAGMA journal_mode; truncate
自機ではtruncateが取得できました。取得できるモード一覧は下記です。
- DELETE:トランザクション終了時にジャーナルファイルを削除する
- TRUNCATE:トランザクション終了時にジャーナルファイルサイズを0にする
- PERSIST:トランザクション終了時にヘッダを無効にして使用不可にする
- MEMORY:ジャーナルファイルをメモリ上に保存する
- OFF:ジャーナルファイル機能を使用しない(トランザクションのロールバック不可)
「journalファイルが削除されない」と言ったケースでは、ジャーナルモードを取得して
みましょう。
モードTRUNCATEであれば、正常にトランザクション終了している場合はファイルサイズが
0になっているはずです。
以上です。