У нас есть веб-приложение интернет-магазина, работающее на django, postgresql и heroku.
Для конкретной кампании (вы можете думать, что кампания похожа на продукт для покупки), мы успешно продали 10 000 копий. Тем не менее, согласно нашим отчетам Sentry, некоторые из наших пользователей сталкивались с этой ошибкой. Общая спецификация этих пользователей: Ни один из них не имеет адресной информации перед покупкой. Как правило, пользователи заполняют адресную форму сразу после регистрации. Если они этого не делают, они должны заполнить форму при покупке продукта и отправить их вместе.
Вот как выглядит трассировка:
OperationalError: cursor "_django_curs_140398688327424_146" does not exist
(66 additional frame(s) were not displayed)
...
File "store/apps/store_main/templatetags/store_form_filters.py", line 31, in render_form
return render_to_string('widgets/store_form_renderer.html', ctx)
File "store/apps/store_main/templatetags/store_form_filters.py", line 20, in render_widget
return render_to_string('widgets/store_widget_renderer.html', ctx)
File "store/apps/store_main/widgets.py", line 40, in render
attrs=attrs) + "<span class='js-select-support select-arrow'></span><div class='js-select-support select-arrow-space'><b></b></div>"
OperationalError: cursor "_django_curs_140398688327424_146" does not exist
Итак, еще одна странная вещь - сообщения об исключениях между SQL-запросами до сбоя. Вы можете увидеть это на изображении ниже:
Я добавляю его, если они как-то связаны. Что также может быть связано с тем, что пользователи, которые получают эту ошибку, являются пользователями, которые пытаются купить кампанию сразу после массовой рассылки. Таким образом, интенсивный трафик может быть причиной, но мы также не уверены.
Мы спросили Heroku о проблеме, поскольку они размещают postgres, но они также не имеют никакой подсказки.
Я знаю, что формальная причина этой ошибки - попытка добраться до курсора после коммита. Так как он уничтожается после транзакции, попытка достичь его вызывает эту ошибку, но я не вижу этого в нашем сценарии. Мы никак не касаемся курсора. Что мне не хватает? Что может вызвать эту ошибку? Как это предотвратить? Любые идеи будут оценены.