Предотвращение/сокращение тупиковых ситуаций в приложении django
В последнее время у меня возникло несколько проблем при работе с большой базой данных MySQL в django, MySQL, похоже, имеет проблемы с тупиками.
Я продолжаю получать ошибку:
(1213, 'Deadlock found when trying to get lock; try restarting transaction')
Обычно это происходит при вызове функций сохранения или создания для нового экземпляра модели (например).
payment = Payment.objects.create(
to_member=to_member,
to_name="%s" % to_member.username,
from_member=from_member,
from_name="%s" % from_member.username,
description="Resubscription",
type='resubscription',
amount=5.00,
currency=from_member,
processor='e-wallet'
)
Конкретная таблица, в которую я пытаюсь вставить данные, имеет около 3,1 миллиона строк и размер 2,2 ГБ.
В производственном приложении имеется достаточно большое количество активных пользователей (Member). Модель Payment имеет два определенных внешних ключа (to_creator и from_member). Поэтому я подумал, может ли это быть причиной проблемы, а не только модель Payment?
Я пытался настроить различные аспекты конфигурации mysql, чтобы справиться с этим, но, похоже, я либо получаю больше тупиков, либо вся система блокируется!
Ниже приведены мои текущие настройки для замков:
Любая помощь будет очень признательна. Последние несколько дней я вырываю себе волосы из-за этого.
Дан
Прежде всего, есть ли потеря данных? Ошибка в транзакции означает, что она не выполнена и теоретически ваши данные в порядке.
Второе - это не нормальная ситуация для такой маленькой базы данных (да, я вижу, что она 2GB, и да, она довольно маленькая, даже вся база данных могла бы кэшироваться в оперативной памяти)
Давайте проверим: есть ли у вас переопределенный метод .save()
модели Payment
? Если да, пожалуйста, расскажите нам подробнее о том, что вы там видите.
Внутри уже заблокированного кода есть блокирующий код, вам нужно найти его.