当前位置: 首页 > 知识库问答 >
问题:

PSQLException:当前事务被中止,命令被忽略,直到事务块结束

端木皓君
2023-03-14

我在服务器中看到以下(截断的)stacktrace。JBoss 7.1.1最终版日志文件:

Caused by: org.postgresql.util.PSQLException: 
ERROR: current transaction is aborted, commands ignored until end of 
transaction block

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
at org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection$StatementHandler.invoke(AbstractJdbc23PooledConnection.java:455)
at $Proxy49.executeUpdate(Unknown Source)   at org.jboss.jca.adapters.jdbc.WrappedStatement.executeUpdate(WrappedStatement.java:371)
at org.infinispan.loaders.jdbc.TableManipulation.executeUpdateSql(TableManipulation.java:154) [infinispan-cachestore-jdbc-5.1.2.FINAL.jar:5.1.2.FINAL]
... 154 more

检查Postgres日志文件会显示以下语句:

STATEMENT:  SELECT count(*) FROM ISPN_MIXED_BINARY_TABLE_configCache
ERROR:  current transaction is aborted, commands ignored until end of transaction block
STATEMENT:  CREATE TABLE ISPN_MIXED_BINARY_TABLE_configCache(ID_COLUMN VARCHAR(255) NOT NULL, DATA_COLUMN BYTEA, TIMESTAMP_COLUMN BIGINT, PRIMARY KEY (ID_COLUMN))
ERROR:  relation "ispn_mixed_binary_table_configcache" does not exist at character 22

我使用的是JBoss 7.1.1 Final附带的Infinispan,即5.1.2。最终的

这就是我认为正在发生的事情:

  • Infinispan尝试运行选择计数(*) 语句,以查看ISPN_MIXED_BINARY_TABLE_configCache中是否有任何记录

这个错误意味着什么,以及如何解决它?

共有3个答案

卫飞
2023-03-14
匿名用户

我认为最好的解决方案是使用java。sql。保存点。

在执行可以引发SQLException的查询之前,请使用连接方法。设置保存点(),如果引发异常,则只回滚到此保存点,而不是整个事务。

示例代码:

Connection conn = null;
Savepoint savepoint = null;
try {
    conn = getConnection();
    savepoint = conn.setSavepoint();
    //execute some query
} catch(SQLException e) {
    if(conn != null && savepoint != null) {
        conn.rollback(savepoint);
    }
} finally {
   if(conn != null) {
      try {
          conn.close();
      } catch(SQLException e) {}

   }
}

马国源
2023-03-14

在导致当前事务中止的语句之前检查输出。这通常意味着数据库引发了代码忽略的异常,现在期望下一个查询返回一些数据。

因此,您现在的应用程序和数据库之间存在状态不匹配,前者认为一切正常,后者要求您回滚并从头开始重新启动事务。

在这种情况下,您应该捕获所有异常并回滚事务。

这里有一个类似的问题。

呼延哲
2023-03-14

我使用Java和PostgreSQL在表上进行插入时遇到了这个错误。我将说明如何再现此错误:

org.postgresql.util.PSQLException: ERROR: 
current transaction is aborted, commands ignored until end of transaction block

总结:

出现此错误的原因是,您输入了一个事务,但其中一个SQL查询失败,而您将失败吞噬并忽略了它。但这还不够,然后使用相同的连接,使用相同的事务运行另一个查询。在第二个格式正确的查询上引发异常,因为您正在使用一个中断的事务来执行其他工作。默认情况下,PostgreSQL会阻止您执行此操作。

我正在使用:PostgreSQL 9.1.6x86_64-redhat-linux-gnu,由gcc(GCC)4.7.2 20120921(Red Hat4.7.2-2), 64-bit"编译。

我的PostgreSQL驱动程序是:PostgreSQL-9.2-1000。jdbc4。jar

使用Java版本:Java 1.7

下面是table create语句来说明异常:

CREATE TABLE moobar
(
    myval   INT
);

Java程序导致错误:

public void postgresql_insert()
{
    try  
    {
        connection.setAutoCommit(false);  //start of transaction.
        
        Statement statement = connection.createStatement();
        
        System.out.println("start doing statement.execute");
        
        statement.execute(
                "insert into moobar values(" +
                "'this SQL statement fails, and it " +
                "is gobbled up by the catch, okfine'); ");
     
        //The above line throws an exception because we try to cram
        //A string into an Int.  I Expect this, what happens is we gobble 
        //the Exception and ignore it like nothing is wrong.
        //But remember, we are in a TRANSACTION!  so keep reading.

        System.out.println("statement.execute done");
        
        statement.close();
        
    }
    catch (SQLException sqle)
    {
        System.out.println("keep on truckin, keep using " +
                "the last connection because what could go wrong?");
    }
    
    try{
        Statement statement = connection.createStatement();
        
        statement.executeQuery("select * from moobar");

        //This SQL is correctly formed, yet it throws the 
        //'transaction is aborted' SQL Exception, why?  Because:
        //A.  you were in a transaction.
        //B.  You ran a SQL statement that failed.
        //C.  You didn't do a rollback or commit on the affected connection.
        
    }
    catch (SQLException sqle)
    {
        sqle.printStackTrace();
    }   

}

以上代码为我生成此输出:

start doing statement.execute

keep on truckin, keep using the last connection because what could go wrong?

org.postgresql.util.PSQLException: 
  ERROR: current transaction is aborted, commands ignored until 
  end of transaction block

变通方法:

您有几个选择:

>

  • 最简单的解决方案:不要在事务中。将connection.setAutoCommit(false);设置为connection.setAutoCommit(true);。它之所以有效,是因为失败的SQL只是作为失败的SQL语句被忽略。欢迎您随心所欲地失败SQL语句,PostgreSQL不会阻止您。

    保持在事务中,但当检测到第一个SQL失败时,请回滚/重新启动或提交/重新启动事务。然后,您可以继续在该数据库连接上失败任意多个SQL查询。

    不要捕获并忽略SQL语句失败时引发的异常。然后程序将在格式错误的查询上停止。

    取而代之的是,当您对事务中的连接进行查询失败并继续使用该连接时,Oracle不会引发异常。

    为支持PostgreSQL这样做的决定。。。甲骨文让你在中间变得软弱,让你做愚蠢的事情,却忽视了它。

  •  类似资料:
    • 问题内容: 消息有很多错误: 从python-psycopg更改为python-psycopg2作为Django项目的数据库引擎。 代码保持不变,只是不知道这些错误来自何处。 问题答案: 当查询产生错误并且你尝试运行另一个查询而不先回滚事务时,这就是postgres所做的。(你可能会认为这是一项安全功能,可以防止数据被破坏。) 要解决此问题,你将要弄清楚错误查询在代码中的哪个位置执行。在你的Pos

    • 问题内容: 我使用GeoDjango进行了第一步,我正在寻找更好的选项来检查错误的sql语句。 到目前为止,我只是想在我的postgresql表中保护lng + lat点。 该模型定义为: 在我看来,我尝试执行以下命令 但是当我尝试保存表单时收到以下错误: 异常类型:InternalError异常值:当前事务中止,命令被忽略,直到事务块结束 此错误的原因是什么? 我认为sql语句可能有问题,但是检

    • 我有两层(=锚烷),一层叠在另一层上,有一个堆叠窗格。所以这两层都填满了整个场景。问题是,只有顶层接收鼠标事件。 这就是场景的构建方式: 只有按钮B接收点击事件,但按钮A不接收。 如果我将层B设置为鼠标透明(),按钮A将接收鼠标事件。但是鼠标的透明效果也会影响所有的孩子,所以按钮B不再接收鼠标事件。 如何让按钮A和按钮B接收鼠标事件? 以下是完整的工作来源:

    • 在我们的一个项目中,我们遇到了一个问题,Spring忽略了事务注释,然后失败了,出现了以下错误。 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2018-09-13 15:05:18406错误[主]组织。springframework。靴子SpringApplication应用程序运行失败组织。springframework。道。Inva

    • 问题内容: 我需要从存储过程中写入日志表。现在,此日志信息必须能够在回滚过程中幸免。 我知道以前曾问过这个问题,但是我的情况有所不同,在这些问题中找不到我的问题的答案。 当存储过程中没有错误时,事情就很简单了,日志表中的条目就在那里。 当有错误时,事情就变得复杂了。 在该过程中,我可以在catch中进行回滚,然后将数据插入日志表,我知道并且我已经在这样做了。 但是问题是当存储过程这样调用时: 我知

    • 本文向大家介绍易被忽视的js事件问题总结,包括了易被忽视的js事件问题总结的使用技巧和注意事项,需要的朋友参考一下 一、跨平台事件 什么叫跨平台事件?即在不同的浏览器上执行同一事件,所使用的方法不同。 什么是EventUtil对象?有什么作用?即将所有与事件相关的函数,融合在一起的一个容器,方便管理事件对象,它没有属性。主要处理DOM事件和IE事件的磨合,使其尽可能的相似。 下面我们来看一下DOM