python - sqlalchemy、postgresql 和关系卡在 "idle in transaction"

标签 python session transactions sqlalchemy

我有一个与 sqlalchemy 和 postgresql 相关的问题。

class Profile(Base):
  ...

  roles = relationship('Role', secondary=role_profiles,
                       backref='profiles', lazy='dynamic')

运行时(current_userProfile类的一个实例):

roles = current_user.roles.filter().all()

使用 sqlalchemy 我得到 idle in transaction 用于读取 postgresql 中的配置文件的所有选择。

编辑:

通过回显查询,我看到每个选择都以:

BEGIN (implicit)

另一个编辑:

添加后

pool_size=20, max_overflow=0

对于 create_engine 来说,当空闲数量变大时,idle in transaction 语句似乎正在回滚。对此有任何想法吗?这会是解决问题的糟糕方法吗?

我该如何管理它以及如何摆脱选择的 BEGIN

最佳答案

从 SQLAlchemy 0.8.2 开始,您可以在调用 create_engine() 时禁用隐式 BEGIN 语句

engine = create_engine(uri, isolation_level="AUTOCOMMIT")

此更改有一些微妙的含义。首先,未终止事务中未悄悄隐藏的语句将被悄悄忽略

session.execute("DELETE FROM department WHERE department_id=18")
sys.exit(0)

默认:

LOG:  statement: BEGIN
LOG:  statement: show standard_conforming_strings
LOG:  statement: DELETE FROM department WHERE department_id=18
LOG:  unexpected EOF on client connection with an open transaction

自动提交:

LOG:  statement: show standard_conforming_strings
LOG:  statement: DELETE FROM department WHERE department_id=18

其次,更新多次更新不再是自动的,rollback()只是有条件地有效:

department = Department(u"HR")
session.add(department)
session.flush()
employee = Employee(department.department_id, u'Bob')
session.add(employee)
session.rollback()

默认:

LOG:  statement: BEGIN
LOG:  statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id
LOG:  statement: ROLLBACK

自动提交:

LOG:  statement: INSERT INTO department (name) VALUES ('HR') RETURNING department.department_id

在 Engine 对象上设置 SQLAlchemy 的 isolation_level 是有效的 许多应用程序。不幸的是 Session.begin() 并不总是意味着 BEGIN TRANSACTION;

关于python - sqlalchemy、postgresql 和关系卡在 "idle in transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18438300/

相关文章:

python - python 中机架的拼字游戏单词组合

python - 提供注释(类似于 Java 中的 testNG)以对 Python Selenium 测试进行分组

python - 如何有条件地合并两列

django - 在 python/django 中的线程之间共享事务范围? (PostgreSQL)

python - 使用Numpy计算基尼系数

node.js - 如何检查redis中是否已存在 session ID

Codeigniter session 问题

session - 重新部署 Tomcat 应用程序会导致事件 session 被删除

c# - MySQL 和事务不回滚

java - Spring 用户事务与 hibernate