複数のプロセス/ワーカーで Gunicorn を使用して Django を実行すると、手動の MySQL データベース トランザクションの一部でデッドロックの問題が発生します。
DatabaseError(1205, 'Lock wait timeout exceeded; try restarting transaction')
私のセットアップは複数のデータベースを使用しており、私の関数は、呼び出されたときに使用するデータベースを渡す必要があります。このため、データベースを引数としてハードコーディングする必要があるため、標準のDjango トランザクション デコレータを使用できません。デコレーター コードを調べて、トランザクションがどのように管理されているかを確認しました。関数は次のようになります。
from django.db import connections
def process(self, db, data):
# Takeover transaction management
connections[db].enter_transaction_management(True)
connections[db].managed(True)
# Process
try:
# do things with my_objects...
for obj in my_objects:
obj.save(using=db)
connections[db].commit()
except Exception as e:
connections[db].rollback()
finally:
connections[db].leave_transaction_management()
ここで何がうまくいかないのか誰にもわかりますか?