考虑Java应用程序正在打开与Postgres的JDBC连接,AutoCommit设置为false。
在这样的JDBC Connections上,如果我们执行SQL SELECT命令,那么事务边界会发生什么?即使AutoCommit已关闭,是否有任何隐含交易边界?
答案 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
隔离中。
您确实应该正确地执行此操作并自动提交或使用显式事务划分。