我正在调试一个应用程序(在PostgreSQL下),遇到了以下错误:
“当前事务被中止,命令被忽略”。
据我所知,“事务”只是一个与底层数据库连接相关的概念。
如果连接具有自动提交“false”,则可以通过相同的语句执行查询,只要它没有失败。在这种情况下,你应该回滚。
如果auto commit是“true”,那么只要所有查询都被认为是原子的,就没关系了。
使用auto commit false,即使在
select * from foo
失败,这让我问,在哪个SQLException(s)是被认为无效的“事务”下,应该回滚或不用于另一个查询?
使用MacOS 10.5、Java 1.5.0_16、PostgreSQL 8.3和JDBC驱动程序8.1-407.jdbc3
最佳答案
该错误意味着在事务中发送的一个查询已失败,因此在当前事务结束(将自动回滚)之前将忽略其余查询。对于PostgreSQL,事务已失败,在任何情况下都将在错误发生后回滚,只有一个异常。你必须采取适当的措施
放弃陈述,重新开始。
在事务中使用SAVEPOINTs可以返回到该时间点并尝试其他路径。(这是个例外)
启用query logging查看哪个查询失败以及原因。
在任何情况下,您的问题的确切答案是,任何SQLException都应该意味着在发送事务结束命令时发生回滚,也就是在发出COMMIT或rollback(或end)时。这就是它的工作原理,如果您使用保存点,您将仍然受到相同规则的约束,您将能够返回到您保存的位置并尝试其他操作。
关于postgresql - 交易,何时应丢弃并回滚,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/195377/