Можно ли позволить Postgres автоматически повторять транзакции?
Я разрабатываю приложение Django, в котором я хочу иметь сильные гарантии корректности данных. По этой причине у меня SERIALIZABLE
в качестве уровня изоляции транзакций.
Однако, во время нагрузочного тестирования я вижу некоторые связанные сообщения об ошибках:
не удалось сериализовать доступ из-за зависимостей чтения/записи между транзакциями
ПОДРОБНОСТИ: Код причины: Отменена при идентификации как поворотного элемента, во время записи.
СОВЕТ: Транзакция может быть успешной при повторной попытке.
и
не удалось сериализовать доступ из-за зависимостей чтения/записи между транзакциями
ПОДРОБНОСТИ: Код причины: Отменено при конфликте с поворотом 23933812, во время чтения.
СОВЕТ: Транзакция может быть успешной при повторной попытке.
и
текущая транзакция прервана, команды игнорируются до конца блока транзакций
Я автоматически повторяю транзакцию через Django, но я не уверен, что это решение действительно хорошо. Я задался вопросом: Можно ли позволить Postgres автоматически повторять транзакции, которые не прошли по этим причинам? Может быть, есть что-то непосредственно в Django, позволяющее мне настроить это? (Это не обязательно должно быть для всех транзакций; я знаю кандидатов, которые терпят неудачу чаще / которые более важны)
Нет, PostgreSQL не предлагает такой функциональности. Если Django делает это, это замечательно, и вы должны использовать его.
SQLSTATE, которые вы должны поймать, это 40P01 (тупик) и 40001 (сбой сериализации).