django中实现事务的几种方式

发布时间 2023-11-29 21:36:38作者: 别管鱼油我了

django中实现事务的几种方式

https://zhuanlan.zhihu.com/p/622987268

具体表现形式为:每次数据库操作(比如调用save()方法)会立即被提交到数据库中。

但是如果你希望把连续的SQL操作包裹在一个事务里,就需要手动开启事务

根据粒度不同,三种

全局:

全局,每次请求在一个事务中,粒度太大,事务时间很长

 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'llll',
         'HOST': '127.0.0.1',
         'PORT': '3306',
         'USER': 'llll',
         'PASSWORD': '123',
          #全局开启事务,绑定的是http请求响应整个过程
         'ATOMIC_REQUESTS': True, 
         }
    }

局部禁用全局事务

from django.db import transaction

多数据库,用default的视图不受事务控制

@transaction.non_atomic_requests(using='default')
def seckill(request):
    return HttpResponse('秒杀成功')

 

视图开启事务

# fbv开启
from django.db import transaction
@transaction.atomic
def seckill(request):
    return HttpResponse('秒杀成功')


# cbv开启
from django.db import transaction
from rest_framework.views import APIView
class SeckillAPIView(APIView):
    @transaction.atomic
    def post(self, request):
        pass
    
################ 局部使用事务#####################
from django.db import transaction
def seckill(request):
    with transaction.atomic():
        save()
        update()
    return HttpResponse('秒杀成功')