当JDBC AutoCommit为False并且未设置显式事务边界时会发生什么

时间:2015-07-06 21:23:31

标签: java postgresql jdbc

考虑Java应用程序正在打开与Postgres的JDBC连接,AutoCommit设置为false。

在这样的JDBC Connections上,如果我们执行SQL SELECT命令,那么事务边界会发生什么?即使AutoCommit已关闭,是否有任何隐含交易边界?

2 个答案:

答案 0 :(得分:3)

自动提交不会产生任何影响,因为您只是触发选择。

默认事务隔离级别将对select子句起作用 - 对于postgres,它设置为READ_COMMITTED。来自docs

  

Read Committed是PostgreSQL中的默认隔离级别。当一个   transaction使用这个隔离级别,一个SELECT查询(没有FOR   UPDATE / SHARE子句仅查看在查询开始之前提交的数据;   它永远不会看到未提交的数据或在此期间提交的更改   查询并发事务执行。

答案 1 :(得分:3)

6ton是对的,那个答案应该被接受。我只想详细说明一下。

您的申请将留下空闲的未结交易。这可以防止一些清理工作,因为PostgreSQL无法将事务标记为最终提交或回滚。如果您不进行任何写操作(因为没有分配任何交易ID),但仍然应该避免,这并不重要。

如果选择具有副作用的功能,那么这些副作用将不会被提交,并且在您断开连接时会丢失。

如果由于配置,数据库设置或用户默认设置而导致SERIALIZABLE隔离,您将会看到第一个SELECT拍摄的快照中的数据。由于无法VACUUM远离旧行而导致膨胀,您还会遇到数据库性能问题。这不会发生在READ COMMITTED隔离中。

您确实应该正确地执行此操作并自动提交或使用显式事务划分。