Postgres прерывает транзакции и игнорирует запросы до завершения транзакции. Можно ли обработать транзакцию до ее отката?
Я пытаюсь улучшить обработку ошибок в приложении Java/Postgres, и часто возникающая ошибка - слишком длинный ввод для столбца фиксированной длины. Когда это происходит, я откатываю транзакцию обратно, но до того, как откат сделан, я пытаюсь найти способ определить, какой столбец нарушает ограничения длины, чтобы сделать отладку этой ошибки намного проще и эффективнее.
Мой подход заключается в следующем:
- запрос
informationschema.columns
получить все имена столбцов длины, отображаемой в сообщении об ошибке - Запросите каждый столбец, возвращенный на шаге 1, чтобы проверить ограничения длины
Однако, когда я пытаюсь запросить информационную схему, я получаю эту ошибку:
ERROR: current transaction is aborted, commands ignored until end of transaction block
Есть ли способ по-прежнему выполнять запросы из Java на этой транзакции, или есть лучший способ получить столбцы, нарушающие их ограничения длины?
1 ответ
Можно делать то, что ты хочешь.
Вы можете создать SAVEPOINT
перед каждым утверждением, то ROLLBACK TO SAVEPOINT
после и ошибка и продолжить.
Это создает значительные накладные расходы для транзакции, поэтому, как правило, это не очень хорошая идея, но бывают случаи, когда она полезна.
В этом случае я бы просто ROLLBACK
вся транзакция затем запрашивает состояние таблицы или запрашивает ее из другого сеанса. Это хорошо для информационных целей, если вы не используете DDL из транзакции. Если вы выполняете DDL из заинтересованной транзакции, рассмотрите возможность группировки DDL и выполнения SAVEPOINT
после этого перед запуском DML, так что вы можете ROLLBACK TO SAVEPOINT
и запросить таблицы, когда они смотрят на транзакцию.
Вам будет интересно узнать, что продолжается работа по поддержке более структурированных сообщений об ошибках из PostgreSQL, работа, которая должна быть перенесена в PgJDBC, чтобы можно было получить гораздо больше подробностей об ошибках, включая такие вещи, как затронутые таблицы, ограничение нарушены и т. д.