首页 > 其他分享 >django中使用事务的几种方法

django中使用事务的几种方法

时间:2023-12-23 12:33:09浏览次数:48  
标签:事务 transaction savepoint 几种 atomic import 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.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,几种,atomic,import,django
From: https://www.cnblogs.com/shaoyishi/p/17922944.html

相关文章

  • 短视频直播系统,前端比较常见的几种动画实现方式
    短视频直播系统,前端比较常见的几种动画实现方式我整理了如下的6种方式,接下来我们以最简单的例子,一个div从左到右移动一定的距离,分别看看这几种方案的具体实现。如有不妥还望指正。 一、CCSanimation这里省略了html部分,我们直接看css:.box{height:100px;......
  • Spring编程式事务控制
    目录Spring编程式事务控制代码实现测试Spring编程式事务控制实际中很少使用代码实现pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&......
  • Spring基于XML的事务管理器DataSourceTransactionManager
    Spring基于XML的事务管理器DataSourceTransactionManager源码代码测试pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan......
  • Spring基于注解的AOP事务控制
    Spring基于注解的AOP事务控制源码代码测试pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schem......
  • Spring基于XML AOP事务控制
    Spring基于XMLAOP事务控制源码代码测试pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:sche......
  • Spring连接线程的事务控制
    Spring连接线程的事务控制通过把线程ThreadLocal绑定数据库来连接Connection来控制事务源码实现的方式不够优雅代码实现pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org......
  • django 如何在apps目录创建应用
    django-adminstartapp命令创建应用时,默认保存在当前目录, 不过可以带一个路径参数先查看一下帮助信息django-adminstartapp-husage:django-adminstartapp[-h][--templateTEMPLATE][--extensionEXTENSIONS][--nameFILES][--exclude[EXCLUDE]][--version][-v......
  • Vue + Django 使用wangeditor 上传图片 显示跨域报错
    报错:newsDetailed:1 AccesstoXMLHttpRequestat'http://www.py32api.com:8000/users/uploadFile/'fromorigin'http://localhost:8080'hasbeenblockedbyCORSpolicy:RequestheaderfieldtokenisnotallowedbyAccess-Control-Allow-Head......
  • django验证码插件 --- django-simple-captcha
    使用django-simple-captcha实现登录验证码: 第一步:安装pillow依赖pipinstallpillow  -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ 第二步:安装django-simple-captchapipinstalldjango-simple-captcha -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ 第三步:注......
  • django+vue实现文件夹上传
    最近学django的文件上下传,网上的文件夹上下传压根没有,找了好几个,报错一大堆,没有一个能用,花里胡哨,可气!!!下面这个方法是我刚刚用过的,分享给大家。前端vue非常简单,template部分<inputtype="file"id="twos"webkitdirectory/><el-buttontype="primary"@click="sumfolder">文件夹......