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

272

我在 JBoss 7.1.1 Final 的 server.log 文件中看到以下被截断的堆栈跟踪:

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.Final。

所以我认为发生了以下情况:

  • Infinispan尝试运行SELECT count(*)...语句,以查看ISPN_MIXED_BINARY_TABLE_configCache中是否有记录;
  • 由于某种原因,Postgres不喜欢这个语句。
  • Infinispan忽略了这个问题,并继续执行CREATE TABLE语句。
  • Postgres出现错误,因为它仍然认为它是同一个事务,而Infinispan未能回滚此事务,并且从第一个SELECT count(*)...语句开始便出现问题。

这个错误是什么意思?有什么解决方法吗?


如果你像我一样在搜索上述PSQLException: current transaction is aborted... (25P02),或许还包括JPAHibernate,那么请注意了。最终我们发现是因为我们(很好的!)使用了Logback,并且将一个重载了toString()方法的DAO对象传递给它,导致了这个错误,并且被很好地吞掉了(但不幸的是我没有注意到):log.info( "bla bla: {}", obj )产生了**bla bla: [FAILED toString()]**。将其更改为log.info( "bla bla: {}", String.valueOf( obj )可以使其具有空值安全性,但不会将其吞掉,从而保留了事务并在不相关的查询失败时失败。 - Andreas Covidiot
我遇到了相同类型的错误。在执行 SQL 之前,我必须释放连接。我的代码是 connection.commit()。 - md. ariful ahsan
我在这里回答了 https://dev59.com/1nA85IYBdhLWcg3wBOzh#65172183 并且它有效! - Zvi
1
有两种方法可以解决这个问题。1)运行ROLLBACK; 这将解决当前选项卡的问题,2)打开一个新选项卡并运行相同的命令。尝试在运行查询时添加try catch。 - althaf a s
22个回答

-1

我正在使用Spring Boot JPA,通过实现@EnableTransactionManagement进行修复。

附加的文件可能会对你有所帮助。


-4

我正在使用Spring Boot JPA进行开发,并通过实现@EnableTransactionManagement解决了问题。

附加的文件可能会对您有所帮助。enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接