首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >金炼金术回滚的原因

金炼金术回滚的原因
EN

Stack Overflow用户
提问于 2014-03-03 17:13:13
回答 2查看 4.1K关注 0票数 2

我使用sqlalchemy将数据存储到postgresql数据库中。我有点困惑,sqlalchemy没有抛出异常,而是在执行时回滚。我找到了一个纪录片中的文章,并试图通过设置pool_reset_on_return='commit'来防止回滚

这实际上导致sqlalchemy无动于衷。因此,我插入了一个显式调用trans.commit()的行,该行将导致以下输出:

代码语言:javascript
复制
2014-03-03 18:03:33,390,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: INSERT INTO _fd (**)
2014-03-03 18:03:33,391,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_execute_context) [INFO]: {****}
2014-03-03 18:03:33,392,p:32764 Thread-3, sqlalchemy.engine.base.Engine(__init__) [DEBUG]: Col ('fid',)
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(process_rows) [DEBUG]: Row (*,)
2014-03-03 18:03:33,393,p:32764 Thread-3, sqlalchemy.engine.base.Engine(_rollback_impl) [INFO]: ROLLBACK

到目前为止,代码退出很简单:

代码语言:javascript
复制
1837     with conn.begin() as trans:                                                                                                                                                                                                           
1838         statement = meta.tables[_table_name].insert().values(
...
1847         )
1848         res = conn.execute(statement)
1849         trans.commit()

有没有人知道,回滚的原因是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-05 07:58:26

好的,我没有胶水来解释这个习惯的原因,但是在语句的末尾加上一个conn.execute("commit")可以解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2014-03-07 18:27:10

不能100%确定原因,但是看看来源,我们可以看到,当您在with....构造中执行trans.commit()时,它将事务设置为非活动。现在,当事务的Context Manager试图在with语句末尾运行__exit__()方法时,它会触发rollback(),因为is_active标志已设置为False。(我不知道当您提交事务然后回滚时会发生什么)。

无论如何,“问题”是with构造隐式地处理提交和回滚部分。根据文档,你所需要做的就是

代码语言:javascript
复制
with conn.begin() as trans:      
    statement = meta.tables[_table_name].insert().values(
    ...
    )
    res = conn.execute(statement)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22152943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档