大鼻子的大熊猫 · 如何将c代码转换为matlab_如何将mat ...· 1 月前 · |
大气的芒果 · leaflet ...· 8 月前 · |
完美的蟠桃 · Halcon缺陷检测实例转OpenCV实现( ...· 1 年前 · |
坐怀不乱的红金鱼 · 推荐一个简约漂亮的小程序日历插件 - 知乎· 1 年前 · |
憨厚的手电筒 · java将一个List赋值给另一个List的 ...· 1 年前 · |
我在server.log文件JBoss 7.1.1 Final中看到了以下(截断的)堆栈跟踪:
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。
这就是我认为正在发生的事情:
SELECT count(*)...
语句,以查看
ISPN_MIXED_BINARY_TABLE_configCache
中是否有任何记录;
CREATE TABLE
语句。
SELECT count(*)...
语句中传递出来的。
这个错误意味着什么,以及如何绕过它?
发布于 2012-10-27 20:01:39
--我使用Java和PostgreSQL对一个表进行插入,得到了这个错误。我将演示如何重现此错误:
org.postgresql.util.PSQLException: ERROR:
current transaction is aborted, commands ignored until end of transaction block
摘要:
您收到此错误的原因是您输入了一个事务,其中一个SQL查询失败了,而您抢占了该错误并忽略了它。但是这还不够,然后使用相同的连接,使用相同的事务来运行另一个查询。在第二个格式正确的查询中会抛出异常,因为您正在使用一个损坏的事务来执行其他工作。默认情况下,PostgreSQL会阻止您这样做。
我正在使用的
:
PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit".
我的PostgreSQL驱动程序是:
postgresql-9.2-1000.jdbc4.jar
使用Java版本的
:
Java 1.7
这里是用来说明异常的表create语句:
CREATE TABLE moobar
myval INT
);
Java程序导致错误:
public void postgresql_insert()
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?");
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
Workarounds:
你有几个选择:
connection.setAutoCommit(false);
设置为
connection.setAutoCommit(true);
。它可以工作,因为失败的SQL只是作为失败的SQL语句被忽略。欢迎您随心所欲地失败SQL语句,而且PostgreSQL不会阻止您。
为了维护PostgreSQL的决定.甲骨文让你在中间变得软弱,让你做些愚蠢的事情,却忽略了它。
发布于 2012-05-01 15:36:04
检查导致
current transaction is aborted
的语句之前的输出。这通常意味着数据库抛出了代码忽略的异常,现在期望下一个查询返回一些数据。
因此,现在您的应用程序(它认为一切都很好)和数据库之间存在状态不匹配,这要求您从一开始就回滚并重新启动事务。
在这种情况下,您应该捕获所有异常和回滚事务。
发布于 2015-02-21 00:30:19
我认为最好的解决方案是使用
java.sql.Savepoint
。
在执行可以
throw SQLException
的查询之前,请使用
Connection.setSavepoint()
方法,如果抛出异常,则只回滚到该保存点,而不是整个事务。
示例代码:
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) {
坐怀不乱的红金鱼 · 推荐一个简约漂亮的小程序日历插件 - 知乎 1 年前 |