我在JBoss 7.1.1 Final的server.log文件中看到了以下(截断的)stacktrace:

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计数(*)…语句,以查看ISPN_MIXED_BINARY_TABLE_configCache中是否有记录; 出于某种原因,Postgres并不喜欢这种说法。 Infinispan忽略了这一点,继续使用CREATE TABLE语句。 Postgres吐了,因为它仍然认为这是同一个事务,Infinispan未能回滚,这个事务是从第一个SELECT计数(*)…声明。

这个错误意味着什么,你知道如何解决它吗?


当前回答

在postgresql JDBC驱动程序上做了一些工作,与此行为相关: 参见https://github.com/pgjdbc/pgjdbc/pull/477

现在可以通过设置autosave=always in the connection(参见https://jdbc.postgresql.org/documentation/head/connect.html)来避免“当前事务已终止”综合征。由于处理语句执行周围的保存点而产生的开销非常低(详情请参阅上面的链接)。

其他回答

这是PostgreSQL非常奇怪的行为,它甚至不符合PostgreSQL强迫用户显式处理所有内容的理念——因为异常被显式地捕获并忽略了。所以这个辩护也站不住脚。在这种情况下,Oracle表现得更友好,(对我来说)是正确的——它把选择留给了开发人员。

该问题已在Infinispan 5.1.5中修复。CR1: ispn - 2023

我正在使用JDBI和Postgres,遇到了同样的问题,即在违反了前一个事务语句的某些约束后,后续语句将失败(但在我等了一段时间后,比如20-30秒,问题就消失了)。

经过一些研究,我发现问题是我在我的JDBI中“手动”执行事务,即我用BEGIN;…COMMIT;事实证明,它就是罪魁祸首!

在JDBI v2中,我可以添加@Transaction注释,@SqlQuery或@SqlUpdate中的语句将作为事务执行,上面提到的问题就不会再发生了!

将隔离级别从可重复读更改为已提交读。

对我来说,问题是没有安装驱动程序。我下载了驱动程序,并粘贴到~/Library/Tableau/ driver (mac)文件夹中,它工作了。