postgresql - 事务,什么时候应该被丢弃和回滚

标签 postgresql transactions autocommit

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

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

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

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

使用 auto commit false,即使是一个简单的

select * from foo

失败,这让我想问,在哪种情况下 SQLException 是被认为无效的“事务”,应该回滚或不用于其他查询?

using MacOS 10.5, Java 1.5.0_16, PostgreSQL 8.3 with JDBC driver 8.1-407.jdbc3

最佳答案

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

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

启用query logging查看哪个查询失败以及原因。

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

关于postgresql - 事务,什么时候应该被丢弃和回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/195377/

相关文章:

python - Django 2 + PostgreSQL FullText 搜索不匹配它应该的

java - 为什么 Spring Bean Self Invocation 在这里为 Transaction 工作

postgresql - 显示非常长的 postgres 过程的进度(在事务结束之前将数据从事务中传输出去)

java - 为什么不建议在 Hibernate 中使用 "hibernate.connection.autocommit = true"?

algorithm - 使用哈希在数据库中存储密码的替代方法

database - PostgreSQL 唯一索引和字符串大小写

sql - 带有 PostGis 的 Postgres 中的触摸功能

.net - 如何从 .Net 中的 TransactionScope 中正确排除日志记录

java - JDBC 与 Oracle -executeUpdate 自动更改 AutoCommit 的状态

mysql - 有没有办法在 MySQL 中提交后回滚?