使用@ transaction.atomic装饰器的正确位置是什么?

时间:2017-09-02 18:19:33

标签: django transactions

在我的Django应用程序中,我想要在事务中包装的第一个数据库操作可能发生在框架的任何级别 - 它可以在视图,管理器方法或模型方法中。

到目前为止,我的做法是标记最外层方法,其中首先使用@transaction.atomic进行数据库写访问。但我发现这种痛苦需要追踪。当我重构或移动东西时,最外层的方法经常变化。处理这个问题的最佳方法是什么?

以下是我考虑的一些选项,当然我可以接受任何其他建议。

选项1:仅限视图方法。

我是否应该始终在视图级别声明@transaction.atomic并完成它?

@transaction.atomic
def view_method():
    # database operation
    manager_method()

def manager_method():
    # database operation
    model_method()

def model_method():
    # database operation
    another_model_method()

def another_model_method():
    # database operation

选项2:所有方法。

或者我应该包装导致多个数据库操作的每个方法吗?

@transaction.atomic
def view_method():
    # database operation
    manager_method()

@transaction.atomic(savepoint=False)
def manager_method():
    # database operation
    model_method()

@transaction.atomic(savepoint=False)    
def model_method():
    # database operation
    another_model_method()

def another_model_method():
    # database operation

选项3:只有我期望的方法才会被外部调用。

或者我应该仅针对属于应用外部API的方法声明@transaction.atomic?例如,我希望也可以从脚本或管理界面等调用model_method()

@transaction.atomic
def view_method():
    # database operation
    manager_method()

def manager_method():
    # database operation
    model_method()

@transaction.atomic(savepoint=False)    
def model_method():
    # database operation
    another_model_method()

def another_model_method():
    # database operation

此选项似乎是最正确的" ...但它会延续我的问题。外部API可能会随着我重构和重写应用程序而改变,这也迫使我猜测应用程序将来如何使用,我现在可能不知道。

处理此问题的标准方法是什么?

0 个答案:

没有答案