我在服务器中看到以下(截断的)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。最终的
这就是我认为正在发生的事情:
ISPN_MIXED_BINARY_TABLE_configCache
中是否有任何记录这个错误意味着什么,以及如何解决它?
我认为最好的解决方案是使用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) {}
}
}
在导致当前事务中止的语句之前检查输出。这通常意味着数据库引发了代码忽略的异常,现在期望下一个查询返回一些数据。
因此,您现在的应用程序和数据库之间存在状态不匹配,前者认为一切正常,后者要求您回滚并从头开始重新启动事务。
在这种情况下,您应该捕获所有异常并回滚事务。
这里有一个类似的问题。
我使用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