什么时候金字塔提交zodb交易?

时间:2015-03-24 09:45:55

标签: pyramid zodb autocommit

我按照http://docs.pylonsproject.org/docs/pyramid/en/latest/tutorials/wiki/index.html

上的教程进行操作

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

但是,在本教程中,这些调用未显示在视图callables中。我假设有一些中间件会在发送HTTP响应之前捕获异常并调用.abort()或调用.commit(),但我在代码或配置中的任何地方都没有看到它文件。

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

1 个答案:

答案 0 :(得分:7)

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

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

来自文档:

  

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

     
      
  • 是否有一个transaction.doom()导致交易变得“注定”?如果是,transaction.abort()
  •   
  • 底层代码中是否发生异常?如果是的话,transaction.abort()   如果使用了tm.commit_veto配置设置,那么使用应用程序生成的响应调用的提交否决回调是否会返回评估为True的结果?如果是,transaction.abort()
  •   
     

如果这些检查都没有调用transaction.abort(),则使用transaction.commit()提交事务。

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

  

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

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