我不是交易/数据库专家,所以请原谅我对这里措辞的无知:
当你使用Django的transaction.commit_on_success(func)
时,任何传播到commit_on_success
控件的错误都会回滚事务,这当然是非常有用的,以防万一你需要一些全有或全无的动作。这使得Django的基于视图的事务处理对于执行大量操作的视图非常有用。
有时我在commit_on_success
中包装模型方法或普通旧助手函数来实现相同的全有或全无行为。
当您嵌套Django事务时会出现问题。示例:受事务保护的视图调用包含在commit_on_success
中的模型方法,然后使用其他模型执行其他一些操作并导致异常。糟糕,当控件从模型方法返回到commit_on_success
时,事务已提交,现在视图错误,将我的视图更改为全部或部分而不是全部或全部。这不仅限于观点。我可能会进行嵌套操作,所有lots_o_foo_or_nothing()
使用commit_on_success
并调用all_or_nothing_1()
和all_or_nothing_2()
,这些操作都包含在commit_on_success
中。如果lots_o_foo_or_nothing()
错误,则子函数调用将已将其事务提交给数据库,从逻辑上破坏我的数据。
有解决方法吗?再次,请原谅我,如果我误解了某些东西,但这似乎是我亲眼目睹的行为,并且绕过它将是一种极大的便利。
答案 0 :(得分:2)
不是最终解决方案,而是基于此snippet的想法(这本身就是个好主意)
这个加号savepoints可以创建一个很好的解决方案:一个装饰器,如果事务在其他事务中(如果是,正在使用保存点而不是事务),它将知道。