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



Answers

导致current transaction is aborted的语句current transaction is aborted 之前检查输出。 这通常意味着数据库抛出了一个你的代码已经忽略的异常,现在期待下一个查询返回一些数据。

因此,现在您的应用程序(它认为事情没有问题)和数据库之间的状态不匹配,需要您从头开始回滚并重新启动事务。

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

这是一个类似的问题。

Question

我在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 count(*)...语句以查看ISPN_MIXED_BINARY_TABLE_configCache是否有任何记录;
  • Postgres出于某种原因不喜欢这种说法。
  • Infinispan忽略了这一点,并用CREATE TABLE语句向前发展。
  • Postgres barfs,因为它仍然认为它是同一个事务,Infinispan没有回滚,而且这个事务是从第一个SELECT count(*)...语句开始的。

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




如果您在卷上的磁盘空间不足,可能会发生这种情况。




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




我有同样的问题,但后来意识到在数据库中有一个同名的表。 删除后我可以导入文件。




你需要回滚。 JDBC Postgres驱动程序非常糟糕。 但是如果你想保留你的事务,并且只是回滚那个错误,你可以使用保存点:

try {
_stmt = connection.createStatement();
_savePoint = connection.setSavepoint("sp01");
_result = _stmt.executeUpdate(sentence) > 0;
} catch (Exception e){
 if (_savePoint!=null){
 connection.rollback(_savePoint);
}
}

在这里阅读更多:

http://www.postgresql.org/docs/8.1/static/sql-savepoint.html




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

经过一番研究,我发现问题是我在JDBI中“手动”地进行事务处理,即我用BEGIN包围了我的语句; ... COMMIT; 事实证明是罪魁祸首!

在JDBI v2中,我只需添加@Transaction注释,并且@SqlQuery或@SqlUpdate中的语句将作为事务执行,并且上述问题不再发生!




在Ruby on Rails PG中,我创建了一个迁移,迁移了我的数据库,但忘记重新启动我的开发服务器。 我重新启动了我的服务器,它工作。






Links