コードに避けられない bulk_create デッドロックがあります。この部分をアトミックブロック内で処理し、デッドロックが発生したときにトランザクションを再発行することにしました。このようなもの:
while True:
try:
with transaction.atomic():
bulk_create_some_data()
return
except OperationalError:
log_error()
continue
しかし、これはエラーを引き起こしますYou can't execute queries until the end of the 'atomic' block
。のステートメントの履歴を確認mysql
したところ、以下のログが示すようにセーブポイントが破損していることがわかりました。
*************************** 1. row ***************************
event_id: 1
SQL_TEXT: set autocommit=0
MESSAGE_TEXT: NULL
*************************** 2. row ***************************
event_id: 2
SQL_TEXT: SAVEPOINT `s139836523404544_x2`
MESSAGE_TEXT: NULL
*************************** 3. row ***************************
event_id: 3
SQL_TEXT: INSERT INTO `Transaction` ...
MESSAGE_TEXT: Deadlock found when trying to get lock; try restarting transaction
*************************** 4. row ***************************
event_id: 4
SQL_TEXT: ROLLBACK TO SAVEPOINT `s139836523404544_x2`
MESSAGE_TEXT: SAVEPOINT s139836523404544_x2 does not exist
セーブポイントの破損の可能性を説明するこのスレッドを見つけました。これは古いスレッドであり、まだ有効かどうかはわかりません。このようなシナリオを管理して、避けられないロックが原因でプログラムがクラッシュするのを防ぐにはどうすればよいですか。私はdjango 3.1とmysql 8.0を使用しています。