アプリケーションで繰り返し操作を行ったところ(テスト中)、突然奇妙なエラーが発生しました。
OperationalError: database is locked
サーバーを再起動しましたが、エラーが解決しません。それは何についてですか?
django docから:
SQLiteは軽量データベースであることが意図されているため、高レベルの同時実行性をサポートできません。OperationalError:データベースがロックされているエラーは、アプリケーションでsqliteがデフォルト構成で処理できるよりも多くの同時実行が発生していることを示します。このエラーは、1つのスレッドまたはプロセスがデータベース接続に排他ロックを持っており、別のスレッドがロックが解放されるのを待ってタイムアウトしたことを意味します。
PythonのSQLiteラッパーにはデフォルトのタイムアウト値があり、2番目のスレッドがタイムアウトする前にロックを待機できる時間を決定し、OperationalError:データベースがロックされたエラーを発生させます。
このエラーが発生した場合は、次の方法で解決できます。
- 別のデータベースバックエンドに切り替えます。ある時点で、SQLiteは実際のアプリケーションには「ライト」になりすぎます。このような同時実行エラーは、その時点に到達したことを示します。
- コードを書き直して同時実行性を減らし、データベーストランザクションを短期間で確実に実行します。
- タイムアウトデータベースオプションを設定して、デフォルトのタイムアウト値を増やします
http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption
私の場合は、SQLite Browser からデータベースを開いたことが原因でした。ブラウザから閉じると、問題はなくなりました。
これの実際的な理由は、多くの場合、python または django シェルが DB へのリクエストを開き、適切に閉じられなかったことです。端末アクセスを強制終了すると、多くの場合解放されます。今日コマンドラインテストを実行すると、このエラーが発生しました。
編集:これについて定期的に賛成票を獲得します。端末を再起動せずにアクセスを強制終了したい場合は、コマンドラインから次のことができます。
from django import db
db.connections.close_all()
これは、pycharm を介して dbbrowser プラグインを介して sqlite db に接続している場合にも発生する可能性があります。切断すると問題が解決します
私に起こった非常に珍しいシナリオ。
オブジェクトを作成し続ける無限の再帰がありました。
より具体的には、DRF を使用して、ビューで create メソッドをオーバーライドしていました。
def create(self, request, *args, **kwargs):
....
....
return self.create(request, *args, **kwargs)
このコマンドを試してください:
sudo fuser -k 8000/tcp