基于django的交易

时间:2016-08-10 01:15:38

标签: python django

我想知道如何在Django中实现基于事务的查询时改进(如果有的话)我的代码。

这就是我理解我在django文档中读到的ATOMIC_REQUEST的方法。我有这个功能视图:

from django.db import transaction
import sys
@transaction.atomic
def save_progress(request):
   try:
       with atomic.transaction():
           qs = AllProgressModel()
           qs.name = 'level up'
           qs.level = 25
           qs.description = 'Increased 2 level'
           qs.save()
   except:
       print(sys.exc_info())

- 我做得对吗?
- 如果在保存期间发生连接丢失,是否会保存进度?
提前谢谢!

1 个答案:

答案 0 :(得分:1)

你不需要装饰师@transaction.atomicwith atomic.transaction(),通常就足够了。

使用with atomic.transaction()时,请抓住IntegrityError个例外,而不是一次性广泛处理所有例外。

编辑:如果您正在处理原子块之外的异常(如下所示),那么更好的做法是拥有外部原子包装,以处理回滚和其他异常处理部分中可能需要的数据库操作。

from django.db import IntegrityError, transaction
def save_progress(request):
   try:
       # with atomic.transaction() -> produce error ( typo )
       with transaction.atomic(): 
           ...
           qs.name = 'level up'
           qs.level = 25
           qs.description = 'Increased 2 level'
           qs.save()
   except IntegrityError:
       # You are here if something goes within the transaction, after rollback
       # HANDLE exception