Обработка тупиковой ситуации в django с поврежденной точкой сохранения
В моем коде есть неизбежный тупик 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
Я нашел эту тему thread, которая объясняет, что повреждение точки сохранения возможно, это старая тема, и я не уверен, что она все еще актуальна или нет. Как я могу управлять подобным сценарием, чтобы предотвратить неизбежную блокировку, вызывающую крах моей программы. Я использую django 3.1 и mysql 8.0.