MeWrite Docs

SQLite: database is locked

SQLiteデータベースロックエラーの解決方法

概要

SQLiteデータベースが他のプロセスまたはトランザクションによってロックされている状態です。

エラーメッセージ

sqlite3.OperationalError: database is locked

原因

  1. 同時書き込み: 複数プロセスからの書き込み
  2. 長時間トランザクション: コミットされていない変更
  3. WALモード未使用: 読み書きの競合
  4. 接続クローズ忘れ: 接続が開いたまま

解決策

1. WALモードを有効化

1
PRAGMA journal_mode=WAL;
1
2
3
4
import sqlite3

conn = sqlite3.connect('mydb.db')
conn.execute('PRAGMA journal_mode=WAL')

2. タイムアウト設定

1
conn = sqlite3.connect('mydb.db', timeout=30.0)

3. 接続を確実にクローズ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import sqlite3
from contextlib import contextmanager

@contextmanager
def get_connection():
    conn = sqlite3.connect('mydb.db')
    try:
        yield conn
        conn.commit()
    finally:
        conn.close()

with get_connection() as conn:
    conn.execute('INSERT ...')

4. 書き込みは単一プロセスに限定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import queue
import threading

write_queue = queue.Queue()

def writer_thread():
    conn = sqlite3.connect('mydb.db')
    while True:
        sql, params = write_queue.get()
        conn.execute(sql, params)
        conn.commit()

よくある間違い

  • WebアプリケーションでSQLiteを使用
  • トランザクション内で長時間処理

最終更新: 2025-12-09