我要调试应用程序(下PostgreSQL)和遇到的以下错误:"当前事务的中止命令被忽略".

尽我所能理解"交易"只是一个概念相关的基础数据库的连接。

如果连具有自动提交的"虚假",可以执行的查询通过同样的声明只要它不是失败。在这种情况下,你应该回退。

如果自动提交的是"真正的"然后不管只要你所有的查询,被认为是原子的。

使用自动提交虚假的,我得到上述错误的PostgreSQL即使在一个简单的

select * from foo

失败的,这就使我要求,在其下SQLException(s)"交易"被认为是无效的,并应支持或不用于另一个的查询?

使用mac os10.5、Java1.5.0_16,PostgreSQL8.3JDBC驱动8.1-407.jdbc3

有帮助吗?

解决方案

该错误意味着事务中发送的其中一个查询失败,因此其余查询将被忽略,直到当前事务结束(这将自动为回滚)。对于PostgreSQL,事务已经失败,并且在出现错误之后将在任何情况下回滚,但有一个例外。你必须采取适当的措施,

之一
  1. 弃掉声明并重新开始。
  2. 在交易中使用 SAVEPOINT 即可回到那个时间点并尝试另一条道路。 (这是例外)
  3. 启用查询记录以查看哪个查询失败了为什么。

    在任何情况下,您的问题的确切答案是,任何SQLException都应该意味着在发送事务结束命令时发生回滚,即发出COMMIT或ROLLBACK(或END)时。这是它的工作原理,如果你使用保存点,你仍然会受到相同规则的约束,你只需要回到你保存的地方并尝试别的东西。

其他提示

这似乎是一个特征的行为的PostgreSQL,不是共同通过大多数其他DBMS。在一般事(外PostgreSQL),可以有一个动作失败,因为一个错误和随后,在同一交易时,可以尝试的替代行动将取得成功,补偿的错误。一个例子:考虑合并(insert/update)操作。如果你试图插入新的记录但发现它已经存在,可以切换到一个更新的操作变化的现有记录来替代。这一工作现在所有主要DBMS。我不能肯定,它不工作,在PostgreSQL,但这说明我已经看到在其他地方,以及在这个问题,建议在试图插入意味着,任何进一步的活动中的交易是注定要失败的。这是在最严厉和最糟糕的是'无用的'.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top