Django中的事务

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/0models.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/0models.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/0models.IssuesType.objects.create(project_id=1, title="测试事务")return render(request, "home.html")

在这里插入图片描述

3 手动事务

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

from django.db import transactiondef home(request):models.Module.objects.create(project_id=1, title="测试事务前")with transaction.atomic():models.Module.objects.create(project_id=1, title="测试事务")1/0models.IssuesType.objects.create(project_id=1, title="测试事务")return render(request, "home.html")

在这里插入图片描述

4 事务保存点

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

from django.db import transactiondef 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/0models.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 transactiondef 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/0models.IssuesType.objects.create(project_id=1, title="测试事务")transaction.on_commit(sen_msg)except Exception:print("事务执行失败")return render(request, "home.html")

在这里插入图片描述

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

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

相关文章

面向多源异质遥感影像地物分类的自监督预训练方法

源自:测绘学报 作者:薛志祥, 余旭初, 刘景正, 杨国鹏, 刘冰, 余岸竹, 周嘉男, 金上鸿 摘 要 近年来,深度学习改变了遥感图像处理的方法。由于标注高质量样本费时费力,标签样本数量不足的现实问题会严重影响深层神经网络模型的性能。为解决这一突出矛盾…

Linux防火墙相关命令以及ip白名单配置

Linux防火墙相关命令以及ip白名单配置 firewall防火墙基础命令查看防火墙的服务状态查看防火墙的状态服务的开启、关闭和重启查看防火墙规则端口的查询、开放和关闭重启防火墙 防火墙白名单配置部分参数介绍 firewall防火墙基础命令 查看防火墙的服务状态 systemctl status f…

使用 vllm 本地部署 cohere 的 command-r

使用 vllm 本地部署 cohere 的 command-r 0. 引言1. 安装 vllm2. 本地部署 cohere 的 command-r3. 使用 cohere 的 command-r 0. 引言 此文章主要介绍使用 使用 vllm 本地部署 cohere 的 command-r。 1. 安装 vllm 创建虚拟环境, conda create -n myvllm python…

nn.Embedding, nn.Parameter,nn.linear的区别

还没总结: 先贴上参考帖子: Difference between Embedding formulations Issue #60 lucidrains/vit-pytorch GitHub https://audreywongkg.medium.com/pytorch-nn-parameter-vs-nn-linear-2131e319e463 Differences between nn.Embedding and nn.…

网络安全之CSRFSSRF漏洞(上篇)(技术进阶)

目录 一,CSRF篇 二,认识什么是CSRF 三,实现CSRF攻击的前提 四,实战演练 【1】案例1 【2】案例2 【3】案例3 【4】案例4(metinfo) 一,CSRF篇 二,认识什么是CSRF CSRF&#x…

Diff算法深度剖析:优化DOM操作的关键

React的Diff算法是用于比较新旧虚拟DOM树,以找出需要进行更新的部分。它通过遍历树的节点,并比较节点属性和内容,来确定节点是否需要进行更新。 React的Diff算法采用了一些优化策略,以减少不必要的DOM更新,提高性能。…

程序员过了35岁没人要?“这行越老越香”

程序员35岁失业?参加完OceanBase开发者大会,我又悟了! 周六参加了OceanBase2024 开发者大会的现场,来之前我其实挺忐忑的,我觉得一个数据库产品的发布会,能有什么新鲜的东西? 踏入酒店的那一刻&…

vue 动态改变css样式

文章目录 问题描述 问题描述 大家好!今天是2024年4月26日|农历三月十六,时间过得好快,今天这博文主要动态改变css样式,具体实现效果如下: 在data里面声明一个isShow:true属性,通过isShow显示不同的图片 isS…

RouteRecordRaw

最近在学习并使用typescript,接触到了很多新类型,今天在学习过程中,看到了RouteRecordRaw这个类型,写篇博客记录一下。 RouteRecordRaw RouteRecordRaw 是 Vue Router 4 中新增的一个类型定义。 它是用于定义路由记录的。 在 Vu…

Pinia 深度剖析:Vue.js 应用状态管理的全面指南

一、pinia简介 Pinia 是一个专门为 Vue.js 应用程序设计的状态管理库。它的设计理念是简化状态管理过程,提供一种清晰、可维护的方式来管理应用程序中的数据。 二、安装与创建 1.你可以通过 npm 或者 yarn 来安装 Pinia: npm install pinia # 或者 y…

上位机工作感想-从C#到Qt的转变-2

2.技术总结 语言方面 最大收获就是掌握了C Qt编程,自己也是粗看了一遍《深入理解计算机系统》,大致了解了计算机基本组成、虚拟内存、缓存命中率等基基础知识,那本书确实有的部分看起来很吃力,等这段时间忙完再研读一遍。对于封装…

消消乐算法总结

前言 最近在工作中遇到一个问题,做一个消消乐的demo项目,连续相同数目超过四个后就要消除。我在网上看了很多解决方案,有十字形,横向,纵向,梯形搜索。越看越迷糊。这不是用一个BFS就能解决的问题吗&#x…

linux下tcp/udp协议网络通信接口封装+日志打印对象

目录 引入 代码 log.hpp代码 引入 我们可以把之前写过的代码拿过来整合一下,直接封装出网络套接字的接口 这样之后再使用的话,直接调用接口即可这里写的是tcp协议,也可以修改socket函数里的参数,改为udp协议 代码 #pragma once#include <iostream> #include <stri…

实现 vuereact 混合开发项目步骤-微前端

微前端是一种将多个小型前端应用组合成一个大型应用的架构方式。它允许团队独立开发、测试、部署和维护应用的各个部分。Vue.js 和 React 是两个流行的前端框架&#xff0c;它们可以在同一微前端架构下协同工作。 一、常规流程 1. 项目规划 确定项目的范围和目标。 设计应用的…

Qt:实现TCP同步与异步读写消息

一、异步读写 在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息涉及使用 QTcpSocket 和 QTcpServer 类。这两个类提供了用于建立 TCP 连接、发送和接收数据的功能。下面是一个简单的示例&#xff0c;演示了如何在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息&…

ISP比普通的静态代理相比有什么优势?

ISP&#xff08;Internet Service Provider&#xff09;&#xff0c;即互联网服务提供商&#xff0c;是向广大用户综合提供互联网接入业务、信息业务、增值业务的电信运营商。而静态代理则是一个固定不变的代理IP地址&#xff0c;具有稳定性强、兼容性好和管理方便等特点。当我…

深入理解Java消息中间件-Apache Kafka

在数字化时代&#xff0c;数据如同血液一样流动于现代应用的每一个角落。如何高效、可靠地处理这些数据流&#xff0c;成为了构建响应式、可扩展和弹性系统的关键挑战。作为一名专业的Java技术架构师和作家&#xff0c;我将深入分析Apache Kafka这一广泛使用的Java消息中间件解…

LiveNVR监控流媒体Onvif/RTSP常见问题-如何对比监控摄像头延时视频流延时支持webrtc视频流播放超低延时播放

LiveNVR如何对比监控摄像头延时视频流延时支持webrtc视频流播放超低延时播放 1、问题场景2、如何对比延时&#xff1f;3、WEBRTC延时对比4、LiveNVR支持WEBRTC输出5、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、问题场景 需要低延时的视频流监控播放&#xff0c;之前可以用rtmp…

什么是架构?说说我的理解

什么是架构了&#xff1f;其实就是根据企业的具体情况给出的一个解决方案&#xff0c;并且这个架构能升级&#xff0c;如果企业的流量突然暴增&#xff0c;也能适应变化&#xff0c;这才是好的架构&#xff0c;一个项目是采用单体架构了&#xff1f;还是采用前后端分离&#xf…

在docker容器中编译 rk3588 ubuntu固件

文件准备 Linux SDK ---- rk3588_linux_release_20230114_v1.0.6c_0*Ubuntu根文件系统 ---- Ubuntu22.04-Xfce_RK3588_v3.11-27_20240410.img.7z 硬件环境 一个可联网的linux机器&#xff0c;并且装有docker 打包一个docker编译环境 Dockerfile内容 直接通过dockerfile构…