Django - 初始样式事务处理

时间:2011-03-23 20:29:00

标签: python database django transactions

我不是交易/数据库专家,所以请原谅我对这里措辞的无知:

当你使用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()错误,则子函数调用将已将其事务提交给数据库,从逻辑上破坏我的数据。

有解决方法吗?再次,请原谅我,如果我误解了某些东西,但这似乎是我亲眼目睹的行为,并且绕过它将是一种极大的便利。

1 个答案:

答案 0 :(得分:2)

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

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