首页 > 其他分享 >django中使用开启事务的三种方式

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

时间:2023-08-15 15:12:18浏览次数:38  
标签:事务 transaction savepoint 开启 django 三种 atomic

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.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) #提交保存点

标签:事务,transaction,savepoint,开启,django,三种,atomic
From: https://www.cnblogs.com/yangyucai/p/17631330.html

相关文章

  • Net7配置Autofac下IOC中的AOP,以及Autofac的三种生命周期写法
    Net7配置Autofac下IOC中的AOP是分两种,一种是基于接口的,一种是基于实现类的基于接口的好处是简单,但不能有效的控制具体到某个方法。也就是说,只能基于类来做操作,一个类下所有的方法都要接受注册基于实现类的是稍微麻烦一点,生效方法必须改为virtual,但可以实现到具体某个方法的效......
  • Django templatetags使用
     webapp文件夹下创建templatetags文件夹templates文件夹下创建tags文件夹 templatetags文件夹下创建menu.pyfromdjango.templateimportLibraryregister=Library()@register.inclusion_tag("tags/nb_menu.html")defnb_menu(request):print(555,request.nv_login......
  • 外企开展中国在线业务的三种网络加速方案:含免ICP备案CDN解决方案
    中国作为全球除美国外最大的消费市场,是几乎每个国际化企业都想要深入挖掘的市场,但外国企业在中国开展在线业务需要面临一个比较特殊的挑战:互联网防火墙。为此所有想要在中国市场有所作为的外企都需要首先解决这个问题。本文旨在为想要进入中国市场的外国客户提供一些网络设施方面的......
  • 中电金信新企架 开启数字化转型“轻”时代
    2022年12月15日,中国国际金融论坛在上海举办。国内外金融机构、生态企业共襄盛会,共议绿色金融、银行业数字化转型等议题,共享服务实体经济高质量发展的新举措、新模式。​ △中电金信研究院副院长、企业数字化架构转型咨询部总经理曲向阳发布会带来主旨演讲峰会现场,中电金信发......
  • WAVE SUMMIT2023六大分会场同步开启,飞桨+文心大模型加速区域产业智能化!
    由深度学习技术及应用国家工程研究中心主办、百度飞桨和文心大模型承办的WAVESUMMIT深度学习开发者大会2023将于8月16日重磅来袭!届时上海、广州、深圳、成都、南昌和宁波六大分会场将同步开启!分会汇聚区域产业大咖、科研机构专家、知名学者和技术大牛,通过主题演讲和深度交流等形式......
  • IO密集型服务提升性能的三种方法
      大部分的业务系统其实都是IO密集型的系统,比如像我们面向B端提供摄像头服务,很多的接口其实就是将各种各样的数据汇总起来,展示给用户,我们的数据来源包括Redis、Mysql、Hbase、以及依赖的一些服务方的数据,并不涉及到太多复杂的计算逻辑。在过去的半年中,因为我们数据量和业务复杂性......
  • webdriver 的三种等待方式(强制等待、隐式等待、显示等待)
    在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三......
  • 创建线程的有哪些方式?创建线程的三种方式的对比?
    ##引言多线程编程是现代软件开发中的重要部分之一。通过利用多线程可以提高程序的并发性和响应能力。在Java中,创建线程的方式有多种,每种方式各有优缺点。本文将介绍创建线程的三种主要方式,并对它们进行比较和对比。继承Thread类继承Thread类是创建线程的一种常见方式。它的特点......
  • django添加装饰器进行登录角色验证
    目的:在用户请求各种接口时验证role字段是否不为user1.创建装饰器  decorators.pyfromdjango.httpimportJsonResponsefromfunctoolsimportwrapsfromutils.tokenimportget_useridfromyshop.modelsimportMyUserdefcheck_role(view_func):@wraps(view_......
  • 直播app系统源码中加载图片的三种方式
    直播APP系统源码中,加载图片可以很好的提高用户体验,图片预先加载出来,可以方便用户更好的去观看,避免很长的等待时间,让用户更加快速冲浪,本文将为大家分享三个直播app系统源码中加载图片的方式。方式一:直播app系统源码中src指向图像的位置最常用的一种方式,无需搭配后端代码<img sr......