psycopg2执行SELECT报错后事务保持开启相关问题咨询
问题1:psycopg2是否会为所有execute()调用开启TRANSACTION,哪怕是SELECT查询?
是的。psycopg2默认关闭autocommit(也就是connection.autocommit = False是默认配置),该模式下,任何首次执行的execute()语句,不管是SELECT查询还是其他增删改、DDL语句,都会自动启动一个事务,所有后续的数据库操作都在这个事务中运行,直到你主动调用connection.commit()提交事务,或者connection.rollback()回滚事务才会结束。
你遇到的报错就是典型的事务异常场景:第一条SELECT语句执行失败后,当前事务进入了aborted状态,PostgreSQL会拒绝该事务后续的所有操作,直到你回滚这个错误事务才能恢复正常操作,这种情况只需要执行一次connection.rollback()即可恢复。
问题2:是否可以让SELECT查询不开启TRANSACTION?
可以,常见的实现方案有两种:
- 启用连接的autocommit模式:将
connection.autocommit设置为True,此时PostgreSQL会把每一条独立执行的语句都作为一个单独的事务处理,执行完成后自动提交,不会留下长期挂起的事务,就算SELECT执行报错也不会影响后续语句的执行。如果只需要部分SELECT查询不占用长事务,可以在执行SELECT前临时开启autocommit,执行完成后再改回False即可。 - 单独创建启用autocommit的只读连接:如果你的业务需要同时支持手动控制事务的写操作、和无事务的读操作,可以单独新建一个连接专门用于跑SELECT查询,该连接固定开启autocommit,和写操作的连接隔离,互不影响。
内容的提问来源于stack exchange,提问作者PersianMan
相关产品推荐
相关产品推荐

