【问题标题】:Django transaction managementDjango 事务管理
【发布时间】:2010-11-29 20:58:34
【问题描述】:

我有一个 django 项目,其中数据库值需要经常自行更新。有一个 cronjob 运行以更新数据库中的这些值,但有些操作需要原子事务。有谁知道如何在 django 中使模型方法成为一个完整的事务而不通过视图?

理想情况下,我希望能够在方法的开头启动事务并在最后提交它,然后能够从任何地方(视图或 cronjob)调用该方法并保证该方法是原子的。

如果你知道怎么做,我还需要知道,如果提交失败(由于同时写入或其他原因),事务是否会自动重新尝试,或者我是否必须手动捕获失败异常并重新调用该方法。

谢谢。

【问题讨论】:

    标签: django transactions


    【解决方案1】:

    你看过 Django 的transaction docs 吗?尤其是 @transaction.commit_on_success (source code) 装饰器。如果修饰函数返回而不引发异常,它会提交事务。如果发生异常,它会进行回滚。

    【讨论】:

    • 是的,这是适合使用的东西。我认为 OP 很担心,因为文档仅将这些与视图结合使用,而不是模型方法,但是查看源代码,那里没有任何东西在视图之外不起作用。
    • 在文档的那个页面上实际上有一条注释说“虽然下面的示例使用视图函数作为示例,但这些装饰器也可以应用于非视图函数。”
    • 谢谢。您是否知道如果尝试同时写入会发生什么?事务是否重新尝试,如果没有,它会抛出什么?谢谢!
    • @Nate 取决于您的数据库后端,它与 Django 无关。我不知道有任何数据库后端会“重新尝试”失败的事务,但我不是数据库专家。
    • 注:源代码已经改变,由于代码已经改变,它不再指向正确的地方。另外,看起来 django 在 1.5 中对事务进行了相当大的修改。 transaction.commit_on_success 现在是(我认为)transaction.atomic
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2016-12-02
    • 2017-03-29
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多