SQLAlchemy长时间运行脚本:用户持有关系锁太长时间

时间:2015-05-07 10:02:06

标签: python postgresql session transactions sqlalchemy

我在脚本中有一个SQLAlchemy会话。该脚本运行了很长时间,它只从数据库中提取数据,从不更新或插入。

我遇到了很多错误,比如

sqlalchemy.exc.DBAPIError: (TransactionRollbackError) terminating connection due to conflict with recovery
DETAIL:  User was holding a relation lock for too long.

我理解它的方式,SQLAlchemy使用发出的第一个select创建一个事务,然后重用它。由于我的脚本可能会运行大约一个小时,因此很可能在该事务的生命周期内出现冲突。

为了摆脱这个错误,我可以在不推荐的模式下使用autocommit(不做更多的事情),但文档明确表示不鼓励这样做。

处理错误的正确方法是什么?我可以在没有交易的情况下使用ORM查询吗?

1 个答案:

答案 0 :(得分:0)

我(几乎)每次选择后都结束了会话,比如

session.query(Foo).all()
session.close()

因为我不使用自动提交,所以会自动打开一个新事务。