django中使用事务的几种方法

django中使用开启事务的三种方式

一.全局开启事务

# settings.py
DATABASES = {
         'default': {
              #全局开启事务,绑定的是http请求响应整个过程
             'ATOMIC_REQUESTS': True, 
         }
  }
 
# 局部禁用
from django.db import transaction
    # 局部禁用事务
    @transaction.non_atomic_requests
    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
 

  上述中特别注意是@transaction.atomic而不是@transaction.atomic()

三.局部使用事务

transaction.atomic()  # 开启事务
transaction.commit()  # 提交事务
transaction.rollback() # 回滚事务
使用上下文

使用上线文模式会自动提交和回滚

from django.db import transaction
def seckill(request):
    with transaction.atomic():
        pass  # 都在一个事物中
    return HttpResponse('秒杀成功')
纯手动
from .models import Book
from django.db import transaction
def seckill(request):
    with transaction.atomic():
        # 设置回滚点,一定要开启事务
        sid = transaction.savepoint()
        print(sid)
        try:
            book = Book.objects.get(pk=1)
            book.name = '红楼梦'
            book.save()
        except Exception as e:
            # 如发生异常,回滚到指定地方
            transaction.savepoint_rollback(sid)
            print('出异常了,回滚')
        # 如果没有异常,显式地提交一次事务
        transaction.savepoint_commit(sid)
    return HttpResponse('秒杀成功')
 
 
'''
在事务操作中,我们还会经常显式地设置保存点(savepoint)
一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的保存点
如果没有问题,就使用savepoint_commit方法提交事务
'''
 
transaction.atomic()  # 开启事务
sid = transaction.savepoint() # 设置保存点
transaction.savepoint_rollback(sid) # 回滚到保存点
transaction.savepoint_commit(sid) #提交保存点

  

 

posted on 2023-12-23 12:26  一先生94  阅读(211)  评论(0编辑  收藏  举报

导航