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://xiahunao.cn/news/2980874.html

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

相关文章

2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介: 2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗,并使无人机能够适应复杂环…

薄板样条插值TPS原理以及torch和opencv实现

薄板样条插值TPS原理以及torch和opencv实现 1、薄板样条插值TPS原理概述原理以及公式推导2、torch实现3、opencv实现1、薄板样条插值TPS原理 概述 薄板样条(Thin Plate Spline),简称TPS,是一种插值方法,可找到通过所有给定点的“最小弯曲”光滑曲面。因为它一般都是基于…

跟着野火从零开始手搓emWin(1)初识emWin

PS:在嵌入式领域,本人认为QT的应用范围和性能几乎吊打市面上所有的GUI工具。但是本人之所以学习emWin,是因为自己有些微不足道的小想法,需要通过它来实现。但是QT有点吃硬件的配置,为了MCU专门发行的QT我又懒得去弄&am…

vscode将本地服务转发到外网地址访问

示例中将本地的5500端口,用vscode进行端口转发,在外网地址访问服务 要转发的端口 转发端口 点击转发端口 输入要转发的端口,按下回车 Enter 点击允许,弹出确认界面后点击打开 转发端口已经成功配置上,右键可见性…

四川赢涟电子商务有限公司是做什么的?

在当今数字化浪潮中,电子商务以其独特的魅力和无限潜力,成为了商业领域的新宠。而在这股潮流中,四川赢涟电子商务有限公司以其对抖音电商的深入研究和专业服务,成为了行业内的佼佼者。 一、深耕抖音,领跑电商新赛道 四…

centos 安装配置文件中心 nacos2.2.3 稳定版

安装mysql 8 参考文章 centos7搭建mysql5.6 && mysql 8.0_centos7 mysql5.6-CSDN博客 安装 jdk 17 官网下载 对应的版本 Java Downloads | Oracle wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_l…

(5)步态识别论文研读——GaitDAN:基于对抗域适应的跨视角步态识别

GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation | IEEE Journals & Magazine | IEEE Xplore GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation 基于对抗与适应 摘要:视角变化导致步态外观存在显着差异。因…

qt实现打包

qt实现打包 qt打包流程如下:打包你要注意的点教程 qt打包流程如下: 1,.Release编译: 1),找到release目录(一般会有debug和release两种模式),就是有exe目录的那个文件夹 2),给项目…

QT中基于TCP的网络通信

QT中基于TCP的网络通信 QTcpServer公共成员函数信号 QTcpSocket公共成员函数信号 通信流程服务器端通信流程代码 客户端通信流程代码 使用Qt提供的类进行基于TCP的套接字通信需要用到两个类: QTcpServer:服务器类,用于监听客户端连接以及和客…

牛客网刷题 | BC61 牛牛的二三七整除

描述 牛牛从键盘输入一个整数,请你判断这个整数能被 2 3 7 中哪几个数整除,并按升序输出。如果不能被 2 3 7 任意一个数整除则输出 n。 输入描述: 输入一个整数 输出描述: 输出能被 2 3 7 哪几个数整除,并按升序输…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第七套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第七套 (共9套,有答案和解析,答案非官方,未仔细校正,仅供参考) 部分题目分享,完整版获取(WX:didadidadidida313,加我备注&#x…

【软考经验分享】软考-中级-嵌入式备考

这里写目录标题 教辅用书嵌入式系统设计师考试大纲嵌入式系统设计师教程嵌入式系统设计师5天修炼嵌入式系统设计师考前冲刺100题 刷题软件希赛网软考真题 视频教程希赛网王道-计组计网 教辅用书 嵌入式系统设计师考试大纲 50页左右,内容为罗列一些考点&#xff0c…

QML 不同风格和主题的切换

Quick程序提供了方便的用于切换不同风格和主题的配置文件,如果没有设计稿,又想界面没那么丑,那么可以用这套配置,让应用看起来相对专业一点。 一,在 qrc 资源文件中添加 qtquickcontrols2.conf 文件。 二,…

YOLOv8改进项目汇总-超全改进-ultralyticsPro介绍:订阅了《芒果YOLOv8原创改进专栏》的读者免费赠送,包括很多稀有改进

🔥🔥🔥专注于YOLOv8改进,NEW - YOLOv8 🚀 in PyTorch >, Support to improve Backbone, Neck, Head, Loss, IoU, LA, NMS and other modules🚀 Makes YOLOv8 improvements easy again 芒果出品 YOLOv8…

AI计算中的光学模块:波分复用器的应用前景

在人工智能(AI)的计算领域,光学模块扮演着至关重要的角色。随着AI技术的飞速发展,对数据处理速度和带宽的需求日益增长。光学模块,特别是波分复用器(WDM),因其高速、大容量的数据传输…

【书生浦语第二期实战营学习笔记作业(七)】

课程文档:https://github.com/InternLM/Tutorial/blob/camp2/opencompass/readme.md 课程作业:https://github.com/InternLM/Tutorial/blob/camp2/opencompass/homework.md OpenCompass 大模型评测实战 1. 大模型的评测1.1 大模型评测如何促进发展1.2 大…

适用于手机蓝牙的热敏晶体FA1612AS

EPSON推出的一款1612小尺寸无源热敏晶体:FA1612AS。FA1612AS的额定频率为38.4Mhz的晶体单元,采用无铅材料,符合ROHS标准,内置热敏电阻,可用于移动电话,蓝牙等。热敏晶体FA1612AS的产品特性:额定频率:38.4MHZ外部尺寸规…

【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。

操作环境: MATLAB 2022a 1、算法描述 A算法与DWA算法的融合是一个高效的路径规划策略,这种策略将A算法的全局路径规划能力与DWA算法的局部避障能力结合起来,以期达到更快、更安全的导航效果。以下是对这种融合策略的详细描述。 一、基本概…

ESP32开发

目录 1、简介 1.1 种类 1.2 特点 1.3 管脚功能 1.4 接线方式 1.5 工作模式 2、基础AT指令介绍 2.1 AT指令类型 2.2 基础指令及其描述 2.3 使用AT指令需要注意的事 3、AT指令分类和提示信息 3.1 选择是否保存到Flash的区别 3.2 提示信息 3.3 其他会保存到Flash的A…

更易使用,OceanBase开发者工具 ODC 4.2.4 版本升级

亲爱的朋友们,大家好!我们的ODC(OceanBase Developer Center )再次迎来了重要的升级V 4.2.4,这次我们诚意满满,从五个方面为大家精心打造了一个更加易用、贴心,且功能更强的新版本,相…