3

我正在尝试调试应用程序(在 PostgreSQL 下)并遇到以下错误:“当前事务已中止,命令被忽略”。

据我所知,“事务”只是一个与底层数据库连接相关的概念。

如果连接具有自动提交“false”,您可以通过相同的语句执行查询,只要它没有失败。在这种情况下,您应该回滚。

如果自动提交为“真”,那么只要您的所有查询都被认为是原子的,这并不重要。

使用 auto commit false,即使是一个简单的 PostgreSQL,我也会收到上述错误

select * from foo

失败了,这让我问,在哪个 SQLException(s) 下是一个被认为无效的“事务”,应该回滚还是不用于另一个查询?

使用 MacOS 10.5、Java 1.5.0_16、PostgreSQL 8.3 和 JDBC 驱动程序 8.1-407.jdbc3

4

2 回答 2

5

该错误意味着事务中发送的查询之一失败,因此其余查询将被忽略,直到当前事务结束(这将自动回滚)。对 PostgreSQL 而言,事务已经失败,并且在错误发生后无论如何都会回滚,但有一个异常。你必须采取适当的措施,其中之一

  1. 放弃声明并重新开始。
  2. 在事务中使用SAVEPOINT能够及时回到那个时间点并尝试另一条路径。(这是个例外)

启用查询日志记录以查看哪个查询是失败的以及原因。

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

于 2008-10-12T11:48:06.213 回答
2

这似乎是大多数其他 DBMS 不共享的 PostgreSQL 的特征行为。通常(在 PostgreSQL 之外),您可以让一个操作因错误而失败,然后在同一个事务中,可以尝试将成功的替代操作,以补偿错误。一个例子:考虑一个合并(插入/更新)操作。如果您尝试 INSERT 新记录但发现它已经存在,您可以切换到更改现有记录的 UPDATE 操作。这在所有主要的 DBMS 中都可以正常工作。我不确定它在 PostgreSQL 中是否不起作用,但我在其他地方以及在这个问题中看到的描述表明,当尝试的 INSERT 意味着事务中的任何进一步活动也注定要失败时。这充其量是严厉的,最坏的情况是“无法使用”。

于 2008-10-12T14:27:23.630 回答