首页 > 其他分享 >Django开启事务

Django开启事务

时间:2023-08-28 10:34:04浏览次数:33  
标签:事务 transaction savepoint 开启 Django 回滚 sid commit

目录

开启事务

1 django中实现事务的几种方式

# 1 全局开启事务---> 全局开启事务,绑定的是http请求响应整个过程
    DATABASES = {
         'default': {
              #全局开启事务,绑定的是http请求响应整个过程
             'ATOMIC_REQUESTS': True, 
         }
    }
    from django.db import transaction
    # 局部禁用事务
    @transaction.non_atomic_requests
    def seckill(request):
        return HttpResponse('秒杀成功')
 
    
# 2 一个视图函数在一个事物中
    # 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

# 3 局部使用事务
from django.db import transaction
def seckill(request):
    with transaction.atomic():
        pass  # 都在一个事物中
    return HttpResponse('秒杀成功')

2 事物的回滚和保存点


# 1 普通事务操作(手动操作)
transaction.atomic()  # 开启事务
transaction.commit()  # 提交事务
transaction.rollback() # 回滚事务

# 2 可以使用上下文管理器来控制(自动操作)
with transaction.atomic():  # 自动提交和回滚
    
    
# 3 保存点
	-开启事务
    干了点事
    设置保存点1
    干了点事
    设置一个保存点2
    干了点事
    
    回滚到干完第二个事,回滚到保存点2
    
    
'''
在事务操作中,我们还会经常显式地设置保存点(savepoint)
一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的保存点
如果没有问题,就使用savepoint_commit方法提交事务
'''
transaction.savepoint()  # 设置保存点
transaction.savepoint_rollback(sid)  # 保存点回滚
transaction.savepoint_commit(sid)  # 提交保存点

# 示例
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('秒杀成功')
transaction.atomic()  # 开启事务
sid = transaction.savepoint() # 设置保存点
transaction.savepoint_rollback(sid) # 回滚到保存点
transaction.savepoint_commit(sid) #提交保存点

 

3 事务提交后,执行某个回调函数

# 有的时候我们希望当前事务提交后立即执行额外的任务,比如客户下订单后立即邮件通知卖家
transaction.on_commit(函数调用)

###### 案例一##################
def send_email():
    print('发送邮件给卖家了')
def seckill(request):
    with transaction.atomic():
        # 设置回滚点,一定要开启事务
        sid = transaction.savepoint()
        print(sid)
        try:
            book = Book.objects.get(pk=1)
            book.count = book.count-1
            book.save()
        except Exception as e:
            # 如发生异常,回滚到指定地方
            transaction.savepoint_rollback(sid)
        else:
            transaction.savepoint_commit(sid)
            #transaction.on_commit(send_email)
            transaction.on_commit(lambda: send_sms.delay('1898288322'))
    return HttpResponse('秒杀成功')


##### 案例二:celery中使用###
transaction.on_commit(lambda: send_sms.delay('1898288322'))

标签:事务,transaction,savepoint,开启,Django,回滚,sid,commit
From: https://www.cnblogs.com/zjyao/p/17661592.html

相关文章

  • Django信号、自定制命令、开启事务、执行原生SQL
    目录Django信号内置信号自定义信号执行原生SQL自定制命令步骤Django信号django自带一套信号机制来帮助我们在框架的不同位置之间传递信息。简单的说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(siganls)发送给一组接收者(receivers)。有内置信号(......
  • django(Ajax、自定义分页器、form组件)
    一、Ajax1概述异步提交局部刷新例子:github注册动态获取用户名实时的跟后端确认并实时展示到前端(局部刷新)朝后端发送请求的方式1.浏览器地址栏直接输入url回车GET请求2.a标签href属性GET请求3.form表单GET......
  • Django-HTML 中设置图片jquery 属性
    img代码如下<imgid="head-img"src="/static/blog/image/headimg.jpg.jpeg"style="height:100px;width:100px;">导入jquery 在HTML末尾加入以下代码<script>//找到头像的input标签绑定change事件$("#id_head_img").k(fu......
  • 寻找注册配置中心最佳评测官,赢取丰厚奖品 | 测评开启,开发者请速速集结
    评测前请点击文末链接,领取MSE-Nacos免费试用,再启动评测。注册配置中心MSE-Nacos(以下简称MSE-Nacos),即Nacos的企业版,开箱即用的Nacos云服务,对Nacos内核进行企业级稳定性加固,故障自动检测及恢复、多可用区容灾、推空保护等特性,具有风险管理能力,全局持续分析并管理集群风......
  • 寻找注册配置中心最佳评测官,赢取丰厚奖品 | 测评开启,开发者请速速集结
    评测前请点击文末链接,领取MSE-Nacos免费试用,再启动评测。注册配置中心MSE-Nacos(以下简称MSE-Nacos),即Nacos的企业版,开箱即用的Nacos云服务,对Nacos内核进行企业级稳定性加固,故障自动检测及恢复、多可用区容灾、推空保护等特性,具有风险管理能力,全局持续分析并管理集群......
  • 13、声明式事务
    13、声明式事务13.1、回顾事务要么都成功,要么都失败事务在开发种十分的重要,设计到数据一致性的问题,非常的重要确保完整性和一致性事务的ACID原则原子性一致性隔离性:多个业务操作同一个资源,防止数据损坏持久性:事务一旦提交,无论系统出现什么问题,结果都不会......
  • django 解决queryset惰性机制,实现实时查询
    django在第一次查询后,就把数据进行缓存。如果对数据进行操作后,再进行查询时直接去缓存中取而不去数据库查询,对于想要实时数据时这并不友好。在百度后解决方案如直:classTodayRecordView(viewsets.ModelViewSet):serializer_class=OrderRecordSerializerpagination_c......
  • SpringBoot - 事务处理
    事务介绍是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败Spring事务管理:注解:@Transactional位置:业务层的方法上、类上、接口上作用:将当前方法交给spring进行事务管理,方法执行前,开始事务。成功执行完毕,提交事务,出现异常,回滚事务引入案......
  • Django学习小记[3] —— Query
    今天学习的是Django的ModelQuery,前一篇已经学习过Model了,讲述的主要是Django中是如何处理关系型数据的模型的,一对一,多对一,多对多等,这篇则主要是描述的查询,能够将数据存进去,还得取出来,Django给每一个Model自动提供了丰富的查询接口,而且能够进行关联查询,基本上,能够满足绝大多数的查......
  • Django学习小记[6]——Class-based View
    这节我们讲一下Class-basedView,为什么要有这个Class-basedView呢?view不都是一个方法吗?跟类有啥关系?其实答案很明显,用类其实是为了抽象,抽象出通用的,将可变的暴露出来,这样我们就可以用最少的代码实现复杂的功能了。Django中,对那些我们平时经常用的View进行了封装,比如用于渲染一......