Python Django-初始风格的事务处理

Python Django-初始风格的事务处理,python,database,django,transactions,Python,Database,Django,Transactions,我不是事务/数据库专家,请原谅我在这里的措词中的无知: 当您使用Django的transaction.commit_on_success(func)时,传播到commit_on_success控件的任何错误都将回滚事务,这在您需要某个方法中的“全有”或“全无”操作的情况下确实非常有用,这使得Django基于视图的事务处理非常适合于做很多事情的视图 有时,我在commit\u on\u success中包装模型方法或普通的旧助手函数,以实现相同的全有或全无行为 问题出现在嵌套Django事务时。示

我不是事务/数据库专家,请原谅我在这里的措词中的无知:

当您使用Django的
transaction.commit_on_success(func)
时,传播到
commit_on_success
控件的任何错误都将回滚事务,这在您需要某个方法中的“全有”或“全无”操作的情况下确实非常有用,这使得Django基于视图的事务处理非常适合于做很多事情的视图

有时,我在
commit\u on\u success
中包装模型方法或普通的旧助手函数,以实现相同的全有或全无行为

问题出现在嵌套Django事务时。示例:受事务保护的视图调用一个模型方法,该方法包装在
commit\u on\u success
中,然后对另一个模型执行其他操作并导致异常。哎呀,当控件从model方法返回到
commit\u on\u success
时,事务被提交,现在视图错误了,将我的视图更改为all或some,而不是all或nothing。这并不局限于视图。我可能有一些嵌套操作正在进行,所有
lots\u o\u foo\u或\u nothing()
在成功时使用
commit\u
并调用
all\u或\u nothing\u 1()
all\u或\u nothing\u 2()
,它们都包装在
commit\u on\u success
中。如果
lots\u o\u foo\u或\u nothing()
出错,子函数调用将已将其事务提交到数据库,逻辑上会损坏我的数据


有办法解决这个问题吗?再一次,请原谅,如果我误解了什么,但这似乎是我亲眼目睹的行为,解决这一问题的方法将非常方便。

不是最终解决方案,而是基于此的想法(这本身就是个好主意)


这个加号可以创建一个很好的解决方案:一个decorator,它可以知道事务是否在其他事务中(如果在其他事务中,则使用保存点而不是事务)。

savepoints@Jerzyk-这将如何解决问题?如果手动保存,则可以从上下文中手动回滚。如果我保存在本地作用域中,然后在该作用域上方发生错误,并传播到请求作用域,该怎么办?请求事务处理目前无法回滚您手动提交的任何内容。一些想法:(我的想法是使用类似的东西加上保存点)进一步看,这类/类似的问题至少已经知道几年了:@Jerzyk-thx,将其放入答案中,以便我可以投票。我喜欢这样,在保存时将一个保存点放入内部提交,如果退出,则回滚到该保存点。这将产生我天真地期望的行为。