Предотвращение/сокращение тупиковых ситуаций в приложении 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? Если да, пожалуйста, расскажите нам подробнее о том, что вы там видите.

Внутри уже заблокированного кода есть блокирующий код, вам нужно найти его.

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