Java Postgres将中止事务并忽略查询,直到事务结束。是否可以在事务回滚之前对其进行处理?

Java Postgres将中止事务并忽略查询,直到事务结束。是否可以在事务回滚之前对其进行处理?,java,postgresql,jdbc,transactions,hibernateexception,Java,Postgresql,Jdbc,Transactions,Hibernateexception,我试图改进Java/Postgres应用程序中的错误处理,经常发生的错误是输入对于固定长度的列来说太长。发生这种情况时,我会回滚事务,但在回滚完成之前,我会尝试找到一种方法来确定哪一列违反了长度约束,从而使调试此错误变得更加容易和高效 我的做法是: 查询informationschema.columns,以获取错误消息中显示的长度的所有列名 查询步骤1中返回的每个列以检查长度约束 但是,当我尝试查询信息架构时,会出现以下错误: ERROR: current transaction is abor

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

我的做法是:

  • 查询
    informationschema.columns
    ,以获取错误消息中显示的长度的所有列名
  • 查询步骤1中返回的每个列以检查长度约束
  • 但是,当我尝试查询信息架构时,会出现以下错误:

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

    有没有一种方法可以继续在这个事务上运行java查询,或者有没有更好的方法来检索违反其长度约束的列?

    可以做您想做的事情

    您可以在每条语句之前创建一个
    保存点
    ,然后在之后创建
    回滚到保存点
    并出错并继续

    这会给事务带来很大的开销,所以这通常不是一个好主意,但在某些情况下它是有用的

    在这种情况下,我只需
    回滚整个事务,然后查询表状态,或者从另一个会话中查询它。除非您是从事务中执行DDL,否则这对于仅用于信息目的是很好的。如果您在感兴趣的事务中正在执行DDL,请考虑在运行DML之前对DDL进行分组并执行<代码>保存点< /代码>,这样您就可以<代码>回滚到SavePooS,并在事务处理时查询表。


    您将有兴趣了解到,有一些工作正在进行,以支持来自PostgreSQL的更多结构化错误消息,这些工作应该继续进行到PgJDBC中,以便获得有关错误的更多详细信息,包括受影响的表、违反的约束等。

    为什么不反过来做呢?数据库上的列长度不能更改,是吗?只需在第一次运行查询时缓存数据库架构中的列长度,然后,当事务因此原因失败时,只需将输入字段的长度与先前检索到的值进行比较。请参见以下内容: