Eld*_*mir 3 autocommit zodb pyramid
我按照http://docs.pylonsproject.org/docs/pyramid/en/latest/tutorials/wiki/index.html上的教程进行了操作
我知道当我添加或更改持久对象(在本例中为Page对象)时,在transaction.commit()调用之前不会保留更改.为了取消更改,我可以致电transaction.abort().
但是,在本教程中,这些调用未显示在视图callables中.我假设有一些中间件可以在发送HTTP响应之前捕获异常并调用.abort()或调用.commit(),但我在代码或配置文件中的任何地方都没有看到它.
你能指出我正确的方向吗?我只需要知道幕后发生了什么,所以我知道我是否需要自己添加一些东西
使用pyramid_tm包裹 ; 它安装了一个管理事务的Tween.
它只是为每个请求启动一个事务,如果请求成功,则提交事务,否则中止.
从文档:
在请求开始时,使用该
transaction.begin()函数启动新事务.一旦请求完成所有工作(即视图已经完成运行),就会测试一些检查:
- 是否
transaction.doom()导致交易变得"注定"?如果是的话transaction.abort().- 底层代码中是否发生异常?如果是这样,
transaction.abort()如果使用了tm.commit_veto配置设置,那么使用应用程序生成的响应调用的commit veto回调是否会返回一个计算结果为True?的结果?如果是的话transaction.abort().如果这些检查都没有调用,
transaction.abort()则使用提交事务transaction.commit().
如果存在可重试的异常(例如ZODB提交冲突),它还将重试请求(从头重新启动它们):
当事务管理器调用下游处理程序时,如果处理程序引发"可重试"异常,则可以将事务管理器配置为尝试使用相同的请求再次调用下游处理程序,实际上"重放"该请求.
默认情况下禁用此行为; 您可以将tm.attempts选项设置为大于1的数字以启用它.