Работа с несколькими таблицами вызывает мертвую блокировку
Когда я занимался настройкой производительности 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.