Django中的事务

news2024/11/18 11:22:38

1 开启全局的事务

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 使用mysql数据库
        'NAME': 'tracerbackend',  # 要连接的数据库
        'USER': 'root',  # 链接数据库的用于名
        'PASSWORD': '123456',  # 链接数据库的用于名
        'HOST': '192.168.1.200',  # mysql服务监听的ip
        'PORT': 3306,  # mysql服务监听的端口
        # 设置为True代表同一个http请求所对应的所有sql都放在一个事务中执行
        # (要么所有都成功,要么所有都失败),这是全局性的配置,如果要对某个
        # http请求放水(然后自定义事务),可以用non_atomic_requests修饰器
        'ATOMIC_REQUESTS': True,

    }
}

在Django中,'ATOMIC_REQUESTS': True 是一个数据库设置选项,它会在每个HTTP请求开始时自动开启一个数据库事务,并在请求结束时提交或回滚该事务。这提供了一种方便的方式来确保数据库操作的原子性,即要么全部成功,要么全部失败。

# 设置中默认开启全局事务
def home(request):
    models.Module.objects.create(project_id=1, title="测试事务")
    1/0
    models.IssuesType.objects.create(project_id=1, title="测试事务")
    return render(request, "home.html")

在这个例子中,我们为默认的数据库连接设置了'ATOMIC_REQUESTS': True。这意味着每当Django处理一个HTTP请求时,它都会自动开启一个数据库事务。如果请求成功完成并且没有发生任何异常,那么事务会在请求结束时自动提交。如果请求期间发生了异常,那么事务会被回滚,从而撤销该请求所做的所有数据库更改。
在这里插入图片描述

from django.db import transaction

# 局部禁用
@transaction.non_atomic_requests
def home(request):

    models.Module.objects.create(project_id=1, title="测试事务")
    1/0
    models.IssuesType.objects.create(project_id=1, title="测试事务")

    return render(request, "home.html")

在这里插入图片描述

注意事项

  • 性能:虽然'ATOMIC_REQUESTS': True可以提供数据一致性的保证,但它也可能对性能产生影响。因为每个请求都在其自己的事务中运行,这可能会增加数据库的开销,特别是在高并发的场景中。因此,在决定使用此选项时,应该仔细评估项目的性能和一致性需求。
  • 长时间运行的请求:对于长时间运行的请求(例如,需要处理大量数据的请求),使用'ATOMIC_REQUESTS': True可能会导致事务保持打开状态很长时间,这可能会增加锁定争用和数据库资源的使用。在这种情况下,可能需要考虑其他的事务管理策略。
  • 手动事务管理:即使启用了'ATOMIC_REQUESTS': True,你仍然可以在需要时手动管理事务。Django的数据库API提供了用于开启、提交和回滚事务的函数和上下文管理器。这些工具允许你在需要时覆盖自动事务管理的行为。
  • 未生效: 如果配置全局事务未生效,有可能是数据库不支持如sqlite不支持事务、中间件对异常进行了捕获导致失效、视图函数局部禁用。

2 开启视图函数的事务

全局开启事务时,在高并发的请求时,对数据库的压力也挺大的,可以在视图函数中对某些重要的操作开启事务比如支付或订单之类的

from django.db import transaction

@transaction.atomic
def home(request):

    models.Module.objects.create(project_id=1, title="测试事务")
    1/0
    models.IssuesType.objects.create(project_id=1, title="测试事务")

    return render(request, "home.html")

在这里插入图片描述

3 手动事务

我们知道MySQL的写数据时互斥锁,一个视图函数中如果耗时较长,并发请求时事务不及时提交时将会都卡在提交事务上,因此在并发并发高的场景时可以将事务的控制颗粒度设置更细些,手动在关键地方设置事务。

from django.db import transaction


def home(request):
    models.Module.objects.create(project_id=1, title="测试事务前")
    with transaction.atomic():
        models.Module.objects.create(project_id=1, title="测试事务")
        1/0
        models.IssuesType.objects.create(project_id=1, title="测试事务")

    return render(request, "home.html")

在这里插入图片描述

4 事务保存点

有时候事务中出现异常,不希望事务中全部的操作都进行回滚,比如记录用户操作行为到数据库的数据我们希望进行回滚

from django.db import transaction


def home(request):
    with transaction.atomic():
        models.Module.objects.create(project_id=1, title="操作事务日志记录到数据库")
        try:
            sid = transaction.savepoint()
            models.Module.objects.create(project_id=1, title="测试事务")
            1/0
            models.IssuesType.objects.create(project_id=1, title="测试事务")
        except:
            transaction.savepoint_rollback(sid)  # 回滚到保存点
    transaction.savepoint_commit(sid)
    return render(request, "home.html")

在这里插入图片描述

5 开启事务回调

有时候我们希望事务提交之后做一些额外操作,比如下发订单成功了,立马发送提醒用户。

from django.db import transaction


def sen_msg():
    print("事务成功")


def home(request):
    try:
        with transaction.atomic():
            models.Module.objects.create(project_id=1, title="操作事务日志记录到数据库")
            models.Module.objects.create(project_id=1, title="测试事务")
            # 测试事务是否成功 1 成功执行on_commit 2 失败不执行
            # 1/0
            models.IssuesType.objects.create(project_id=1, title="测试事务")
            transaction.on_commit(sen_msg)
    except Exception:
        print("事务执行失败")
    return render(request, "home.html")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四、OSPF域间路由

注:区域(area)是以接口进行划分的 描述: R1的g0/0/1接口属于area 0 √ R1属于区域0和区域1 1.设计原则 1、OSPF区域的设计原则: 骨干区域有且只能存在一个 非骨干区域必须和骨干区域相连 多区域时&#…

【Linux实践室】Linux文件打包和解压缩实战指南:tar打包命令操作详解(文末送书)

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔打包2.1.1 👻知识点讲解2.1.2 &…

CTFHub Web 信息泄漏(一)

目录遍历 打开题目 点击开始寻找flag 发现在flag_in_here页面中有四个文件夹 点击打开第一个文件夹 发现里面还有四个文件夹 再次点击打开第一个文件夹 里面什么都没有 尝试对所有文件夹依次都点击打开 在2/4中发现flag.txt 点击打开即可得到flag 不太懂这题的难点&#…

碎碎念,最近做了几款小产品...

极简番茄时钟 一款 Mac 版「极简番茄时钟」软件。 知识卡片制作工具 主打简单,同时支持 Markdown 语法。 智能微信助手 让管理变得轻松,沟通更加高效。 感兴趣,欢迎来这里一起交流,限时免费 ~

揭示C++设计模式中的实现结构及应用——行为型设计模式

简介 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。 通过行为型模式,可以更加清晰地划分类与对象的职责,并…

(学习日记)2024.04.29:UCOSIII第五十三节:User文件夹函数概览(uC-LIB文件夹)第三部分

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

python升级打怪(3)

条件语句,如果if否则else还有一个elif 另外一个搭配是if if else,在Python当中缩进很重要,4个空格或者一个tab。看到缩进你就能知道他跟谁是同一级别的,然后这个:表示的是条件结束。在Python中负数%2它是大于等于1的,…

如何替代传统的方式,提高能源企业敏感文件传输的安全性?

能源行业是一个关键的基础设施领域,它涉及能源的勘探、开采、生产、转换、分配和消费。随着全球经济的发展和人口的增长,能源需求持续上升,这对能源行业的可持续发展提出了挑战。能源行业的传输场景多种多样,需要重点关注能源企业…

语音导航系统:盲人出行的新领航者,实时避障让每一步都安心

在这个日益智能化的社会,一款名为蝙蝠避障专为盲人设计的辅助应用正以其创新的语音导航系统悄然改变着视障群体的出行方式。这款应用凭借其强大的实时避障功能,成为了盲人朋友探索世界的可靠伙伴,让每一次外出都充满了信心与自由。 语…

AMBA-CHI协议详解(二)

《AMBA 5 CHI Architecture Specification》 文章目录 2.1 Channels综述2.2 Channel域段2.2.1 request fields2.2.2 Response fields2.2.3 Snoop request fields2.2.4 Data fields 2.3 事务结构2.3.1 Read transactions2.3.1.1 Allocating Read2.3.1.2 Non-allocating Read 2.…

go稀疏数组

稀疏数组 稀疏数组 稀疏数组 package testimport ("encoding/json""fmt""io/ioutil""log""reflect""testing" )type ValNode struct {Row int json:"row"Col int json:"col"Val int json:&qu…

spring高级篇(四)

1、DispatcherServlet DispatcherServlet 是 Spring MVC 中的一个关键组件,用于处理 Web 请求并将其分发给相应的处理器(Controller)进行处理。它是一个 Servlet,作为前端控制器(Front Controller)的核心&a…

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务,例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件,你需要掌握以下: 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化

【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化 一、修改Jenkins插件下载地址二、汉化Jenkins三、Jenkins 版本查看💖The Begin💖点点关注,收藏不迷路💖 一、修改Jenkins插件下载地址 由于Jenkins官方插件地址下载速度较慢,我们可以通过修改下载地…

本地CPU搭建知识库大模型来体验学习Prompt Engineering/RAG/Agent/Text2sql

目录 1.环境 2.效果 3.概念解析 4.架构图 5. AI畅想 6.涉及到的技术方案 7. db-gpt的提示词 1.环境 基于一台16c 32G的纯CPU的机器来搭建 纯docker 打造 2.效果 3.概念解析 Prompt Engineering : 提示词工程 RAG: 检索增强生成; …

Thinkphp--in-sqlinjection

一、漏洞原理 在 Builder 类的 parseData 方法中&#xff0c;由于程序没有对数据进行很好的过滤&#xff0c;将数据拼接进 SQL 语句&#xff0c;导致 SQL注入漏洞 的产生。 影响版本 5.0.13<ThinkPHP<5.0.15 5.1.0<ThinkPHP<5.1.5 在相应的文件夹位置打开终端…

【Kafka】Windows下安装Kafka(图文记录详细步骤)

【Kafka】Windows下安装Kafka Kafka简介一、Kafka安装前提安装Kafka之前&#xff0c;需要安装JDK、Zookeeper、Scala。1.1、JDK安装&#xff08;version&#xff1a;1.8&#xff09;1.1.1、JDK官网下载1.1.2、JDK网盘下载1.1.3、JDK安装 1.2、Zookeeper安装1.2.1、Zookeeper官网…

SpringCloud(微服务介绍,远程调用RestTemplate,注册中心Nacos,负载均衡Ribbon,环境隔离,进程和线程的区别)【详解】

目录 一、微服务介绍 1. 系统架构的演变 1 单体架构 2 分布式服务 3 微服务 2. SpringCloud介绍 SpringCloud简介 SpringCloud版本 3. 小结 二、远程调用RestTemplate【理解】 1. 服务拆分 1 服务拆分原则 2 服务拆分示例 1) 创建父工程 2) 准备用户服务 1. 用户…

03 Docker入门Dockerfile详解及镜像创建

1.1 使用 Dockerfile 构建镜像 新建一个 Dockerfile 文件vi Dockerfile 将下面的内容复制粘贴进去:## Base Images ## 从天池基础镜像构建(from的base img 根据自己的需要更换,建议使用天池open list镜像链接:https://tianchi.aliyun.com/forum/postDetail?postId=67720) F…

如何利用美国站群服务器实现有效的SEO优化策略?

如何利用美国站群服务器实现有效的SEO优化策略? 在当今数字化时代&#xff0c;SEO优化对于网站的可见性和吸引力至关重要。站群服务器作为一种有效的SEO策略&#xff0c;可以通过多个相关联的网站在不同服务器上的部署&#xff0c;增强网站的权威性和链接多样性。尤其是在利用…