Работа с несколькими таблицами вызывает мертвую блокировку

Когда я занимался настройкой производительности api, поддерживаемого django. Я обнаружил, что можно легко выдать ошибку вроде этой: dead lock found...

Код, вызывающий тупик (я упростил для ясности):


@require_POST
def create_sop_task(request):
    try:
        with transaction.atomic():
            save_id = transaction.savepoint()
            
            db_tpl_obj = SopTemplate.objects.filter(id=template_id).values("type", "status").first()
         
            db_new_st = SopTask.objects.create(**req_args)
            for i, item in enumerate(message):
                SopMessage.objects.create(**kwargs)

            SopTemplate.objects.filter(id=template_id).update(version_time=version_time)
            SopTask.objects.filter(template_id=template_id).update(version_time=version_time)
            SopMessage.objects.filter(template_id=template_id).update(version_time=version_time)

            transaction.savepoint_commit(save_id)
            return JsonResponse({"code": 0, "msg": "success", "data": {"id": db_new_st.id}})
    except Exception as e:
        # ...

Manipulating order in transaction:

создать SopTask

создать SopMessage

обновить SopTemplate

обновить SopTask

обновить SopMessage

If tweak the order like this, everything goes well:

создать SopTask

обновить SopTask

создать SopMessage

обновить SopMessage

обновить SopTemplate

Но я не могу понять, почему это приведет к мертвой блокировке и какой хороший способ избежать этого. Кто-нибудь может объяснить это? Я буду очень признателен.

Я использую MySQL 5.7 с уровнем isolution: READ COMMITTED.

Вернуться на верх