Перейти к содержимому
10 / 10

Обрывы соединения с базой и повторы: что безопасно повторять, а что нет?

Сбои соединения делятся на два класса, и различие определяет, можно ли повторять. Ошибка до отправки или во время установки соединения (недоступен хост, отказ пула, сброс до отправки) означает, что запрос точно не выполнялся — повтор безопасен. Обрыв после отправки оставляет неопределённость: сервер мог выполнить запрос и не успеть ответить, поэтому слепой повтор INSERT создаст дубль. Отсюда правило: повторять без раздумий можно только идемпотентные операции — чтения, UPDATE ... WHERE, вставки с ON CONFLICT DO NOTHING; неидемпотентные требуют ключа идемпотентности либо проверки результата перед повтором. Отдельная категория — переключение на новый узел при отказе: соединения рвутся все сразу, и приложение получает шквал ошибок в течение секунд; здесь спасают повторы с джиттером и предохранитель, иначе все инстансы одновременно бросаются переподключаться. Повторять 40001 и 40P01 нужно всегда — это штатные коды конфликта.

Обрывы соединения с базой и повторы: что безопасно повторять, а что нет? | JScriptiser