【问题标题】:Postgres aborts transactions and ignores queries until the transaction is ended, is it possible to process the transaction before its rolled back?Postgres 中止事务并忽略查询,直到事务结束,是否可以在事务回滚之前处理事务?
【发布时间】:2023-03-09 08:18:01
【问题描述】:

我正在尝试改进 Java/Postgres 应用程序中的错误处理,并且经常发生的错误是输入对于具有固定长度的列来说太长了。发生这种情况时我回滚事务,但在回滚完成之前,我试图找到一种方法来确定哪一列违反了长度限制,以使调试此错误更容易和更有效。

我的做法是:

  1. 查询informationschema.columns获取错误信息中显示长度的所有列名
  2. 查询步骤 1 中返回的每一列以检查长度限制

但是,当我尝试查询信息架构时,我得到了这个错误:

ERROR: current transaction is aborted, commands ignored until end of transaction block

有没有办法在这个事务上仍然运行来自 java 的查询,或者有没有更好的方法来检索违反其长度限制的列?

【问题讨论】:

  • 为什么不反过来呢? db 上的列长度不能改变吗?只需在查询第一次运行时缓存数据库架构中的列长度,然后,当事务因此失败时,只需将输入字段的长度与您之前检索的值进行比较。

标签: java postgresql jdbc transactions hibernateexception


【解决方案1】:

你可以做你想做的事。

您可以在每个语句之前创建SAVEPOINT,然后在之后创建ROLLBACK TO SAVEPOINT,然后出错并继续。

这会为事务带来大量开销,因此通常不是一个好主意,但在某些情况下它很有用。

在这种情况下,我只需 ROLLBACK 整个事务然后查询表状态,或从另一个会话中查询它。除非您从事务中执行 DDL,否则这对于仅供参考的目的是很好的。如果您在感兴趣的事务中执行 DDL,请考虑将 DDL 分组并在运行 DML 之前在其后执行 SAVEPOINT,以便您可以 ROLLBACK TO SAVEPOINT 并在查看事务时查询表。

您将有兴趣了解支持来自 PostgreSQL 的更多结构化错误消息的工作,这些工作应该延续到 PgJDBC 以允许获得有关错误的更多详细信息 - 包括诸如表之类的内容受影响、违反约束等。

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2013-08-04
    • 2012-05-11
    • 2014-11-15
    • 2016-12-11
    • 2023-03-27
    相关资源
    最近更新 更多