【问题标题】:When does pyramid commit zodb transaction?金字塔何时提交 zodb 事务?
【发布时间】:2015-03-24 09:45:54
【问题描述】:

我按照http://docs.pylonsproject.org/docs/pyramid/en/latest/tutorials/wiki/index.html上的教程进行操作

我知道,当我添加或更改持久对象(在本例中为 Page 对象)时,更改不会持久,直到调用 transaction.commit()。为了取消更改,我可以致电transaction.abort()

然而,在本教程中,这些调用并未显示在视图可调用对象中。我假设有一些中间件可以捕获异常并在发送 HTTP 响应之前调用 .abort() 或调用 .commit(),但我在代码或配置文件中没有看到任何提及它。

你能指出我正确的方向吗?我只需要知道幕后发生了什么,所以我知道我是否需要自己添加一些东西

【问题讨论】:

    标签: pyramid zodb autocommit


    【解决方案1】:

    使用pyramid_tm package;它安装了一个管理事务的 Tween。

    它只是为每个请求启动一个事务,如果请求成功,则提交事务,否则中止。

    来自文档:

    在请求开始时,使用transaction.begin() 函数启动新事务。一旦请求完成其所有工作(即视图已完成运行),就会测试一些检查:

    • transaction.doom() 是否导致交易“注定失败”?如果是,transaction.abort()
    • 底层代码是否发生异常?如果是这样,transaction.abort() 如果使用了tm.commit_veto 配置设置,提交否决回调(使用应用程序生成的响应调用)是否返回计算结果为True 的结果?如果是,transaction.abort()

    如果这些检查均未调用transaction.abort(),则事务将改为使用transaction.commit() 提交。

    如果存在可重试异常(例如 ZODB 提交冲突),它也会重试请求(从头开始重新启动):

    当事务管理器调用下游处理程序时,如果处理程序引发“可重试”异常,则可以将事务管理器配置为尝试使用相同的请求再次调用下游处理程序,实际上是“重放”请求。

    默认情况下禁用此行为;您可以将tm.attempts 选项设置为大于 1 的数字以启用它。

    【讨论】:

    • 我找不到它的文档,但是如果请求没有引发异常但仍然返回4xx响应代码,则事务被中止,对吗?
    • @Jens:通常情况下,4xx 响应是由异常引起的,此时this piece of code 将使交易失败。但是,如果视图手动创建了 404 响应代码,则 pyramid_tm tween 将无法知道事务应该中止;在这种情况下手动调用 manager.doom()。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多