gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:33 25 4
gpt4 key购买 nike

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

当您使用 Django 的 transaction.commit_on_success(func) 时,传播到 commit_on_success 控件的任何错误都将回滚事务,这当然非常有用,以防万一您需要在方法中执行一些全有或全无的操作,等等。这使得 Django 的基于 View 的事务处理非常适合执行大量操作的 View 。

有时我在 commit_on_success 中包装模型方法或普通的旧辅助函数以实现相同的全有或全无行为。

当您有嵌套的 Django 事务时,问题就会出现。示例:事务保护 View 调用包装在 commit_on_success 中的模型方法,然后对另一个模型执行一些其他操作并导致异常。糟糕,当控制权从模型方法返回到 commit_on_success 时,事务已提交,现在 View 错误将我的 View 更改为全有或部分,而不是全有或全无。这不仅限于 View 。我可能正在进行嵌套操作,所有 lots_o_foo_or_nothing() 使用 commit_on_success 并调用 all_or_nothing_1()all_or_nothing_2() 它们都包含在 commit_on_success 中。如果 lots_o_foo_or_nothing() 出错,子函数调用将已经将它们的事务提交给数据库,逻辑上会破坏我的数据。

有解决办法吗?再次,请原谅我,如果我误解了什么,但这似乎是我所目睹的行为,解决它的方法会非常方便。

最佳答案

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

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

关于python - Django - 初始风格的事务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5411232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com