在我的Django应用程序中,我想要在事务中包装的第一个数据库操作可能发生在框架的任何级别 - 它可以在视图,管理器方法或模型方法中。
到目前为止,我的做法是标记最外层方法,其中首先使用@transaction.atomic
进行数据库写访问。但我发现这种痛苦需要追踪。当我重构或移动东西时,最外层的方法经常变化。处理这个问题的最佳方法是什么?
以下是我考虑的一些选项,当然我可以接受任何其他建议。
我是否应该始终在视图级别声明@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
或者我应该包装导致多个数据库操作的每个方法吗?
@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
或者我应该仅针对属于应用外部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可能会随着我重构和重写应用程序而改变,这也迫使我猜测应用程序将来如何使用,我现在可能不知道。
处理此问题的标准方法是什么?