django系列之事务操作
Django 默认的事务行为是自动提交,除非事务正在执行,否则每个查询将会马上自动提交到数据库。
1. 全局开启事务
在 Web 里,处理事务比较常用的方式是将每个请求封装在一个事务中。 在你想启用该行为的数据库中,把 settings 配置数据库中的参数 ATOMIC_REQUESTS 设置为 True。
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'testdb', 'USER': 'root', 'PASSWORD': '123', 'HOST': '127.0.0.1', 'PORT': 3306, 'ATOMIC_REQUESTS': True # 全局开启事务,和http请求的整个过程绑定在一起}
}
它是这样工作的:在调用视图方法前,Django 先生成一个事务。如果响应能正常生成,Django 会提交该事务。而如果视图出现异常,Django 则会回滚该事务。
如果你全局开启了事务,你仍然可以使用 non_atomic_requests 装饰器让某些视图方法不受事务控制,但需要注意的是,该装饰器仅作用于视图本身时才会生效,在DRF的viewset中不生效。
from django.db import transaction@transaction.non_atomic_requests
def trans2():valid_data_test = {'gender': "male", 'birth': '2020-10-01', 'tele': 18812341234, 'addr': '南京市雨花台区'}res_test = AuthorDetail.objects.create(**valid_data_test)res_test += 1return Response(status=HTTP_202_ACCEPTED, data={"msg": "insert success"})视图请求trans2被 @transaction.non_atomic_requests 装饰,不受全局事务配置的控制。
class AuthorViewSet(viewsets.ModelViewSet):serializer_class = AuthorDetailSerializer@transaction.non_atomic_requests@action(methods='post', detail=False)def trans(self, request):serializer = self.get_serializer(data=request.data)if serializer.is_valid(raise_exception=True):valid_data = serializer.validated_dataAuthorDetail.objects.create(**valid_data)return Response(status=HTTP_202_ACCEPTED, data={"msg": "insert success"})DRF的视图函数即使被 @transaction.non_atomic_requests 装饰,但是依旧被全局事务配置所控制,所以说 non_atomic_requests 仅作用于视图本身时才会生效。
2 局部开启事务
Django项目中局部开启事务,可以借助于transaction.atomic方法。使用它我们就可以创建一个具备原子性的代码块,一旦代码块正常运行完毕,所有的修改会被提交到数据库。反之,如果有异常,更改会被回滚。
两种方式对某个请求使用事务:
class AuthorViewSet(viewsets.ModelViewSet):serializer_class = AuthorDetailSerializer@transaction.atomic@action(methods='post', detail=False)def trans(self, request):serializer = self.get_serializer(data=request.data)if serializer.is_valid(raise_exception=True):valid_data = serializer.validated_dataAuthorDetail.objects.create(**valid_data)return Response(status=HTTP_202_ACCEPTED, data={"msg": "insert success"})@transaction.atomic
def trans2():valid_data_test = {'gender': "male", 'birth': '2020-10-01', 'tele': 18812341234, 'addr': '南京市雨花台区'}res_test = AuthorDetail.objects.create(**valid_data_test)res_test += 1return Response(status=HTTP_202_ACCEPTED, data={"msg": "insert success"})
对请求中的某个代码块使用事务:
with transaction.atomic():AuthorDetail.objects.create(**valid_data_test)
3. 显式开启保存点
在事务操作中,我们还会经常显式地设置保存点(savepoint)。一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的保存点。如果没有问题,就使用savepoint_commit方法提交事务。
class AuthorDetailViewSet(viewsets.ModelViewSet):serializer_class = AuthorDetailSerializerqueryset = AuthorDetail.objects.all()@action(methods=["post"], detail=False) # detail=False or True: True: 系统会自动在生成的路由中添加pk值def trans(self, request):serializer = self.get_serializer(data=request.data)if serializer.is_valid(raise_exception=True):valid_data = serializer.validated_dataAuthorDetail.objects.create(**valid_data)valid_data_test = {'gender': "male", 'birthday': '2020-10-01', 'telephone': 18812341234, 'addr': '南京市雨花台区'}valid_data_test2 = {'gender': "male", 'birthday': '2020-10-02', 'telephone': 18812341234, 'addr': '南京市雨花台区'}with transaction.atomic():AuthorDetail.objects.create(**valid_data_test)sid = transaction.savepoint()try:res_test2 = AuthorDetail.objects.create(**valid_data_test2)res_test2 += 1except Exception:transaction.savepoint_rollback(sid)print("error and rollback")transaction.savepoint_commit(sid)print("commit success")return Response(status=HTTP_202_ACCEPTED, data={"msg": "insert success"})
4. 事务嵌套
事务嵌套,只有内外两层的事务都执行成功,那么事务才能最终被成功提交。如果内层事务执行失败,那么外层的事务也会失败,事务最终会提交失败。
class AuthorDetailViewSet(viewsets.ModelViewSet):serializer_class = AuthorDetailSerializerqueryset = AuthorDetail.objects.all()@transaction.atomic # 外层事务的执行成功与否,除了它本身外,还依赖于内层事务执行成功与否。@action(methods=["post"], detail=False) # detail=False or True: True: 系统会自动在生成的路由中添加pk值def trans(self, request):serializer = self.get_serializer(data=request.data)if serializer.is_valid(raise_exception=True):valid_data = serializer.validated_dataAuthorDetail.objects.create(**valid_data) # 记录1valid_data_test = {'gender': "male", 'birthday': '2020-10-01', 'telephone': 18812341234, 'addr': '南京市雨花台区'}with transaction.atomic(): # 故意让内层的事务执行失败res_test = AuthorDetail.objects.create(**valid_data_test) # 记录2res_test += 1 return Response(status=HTTP_202_ACCEPTED, data={"msg": "insert success"})最终,我们查得数据库的记录1和记录2都没有入库。
相关文章:
django系列之事务操作
Django 默认的事务行为是自动提交,除非事务正在执行,否则每个查询将会马上自动提交到数据库。 1. 全局开启事务 在 Web 里,处理事务比较常用的方式是将每个请求封装在一个事务中。 在你想启用该行为的数据库中,把 settings 配置…...
stm32学习笔记:中断的应用:对射式红外传感器计次旋转编码器计次
相关API介绍 EXT配置API(stm32f10x exti.h) NVIC 配置API (misc.h) 初始化的中断的步骤 第一步:配置RCC时钟,把涉及外设的时钟都打开 第二步:配置GPIO,设置为输入模式 第三步:配置AFIO࿰…...
one-hot是什么
“one-hot” 是一种编码技术,通常用于机器学习和数据处理中,用来表示分类数据或离散变量。它的目的是将一个分类变量转换成二进制向量,其中只有一个元素是 “hot”(值为1),而其他元素都是 “cold”…...
基于阿基米德优化优化的BP神经网络(分类应用) - 附代码
基于阿基米德优化优化的BP神经网络(分类应用) - 附代码 文章目录 基于阿基米德优化优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.阿基米德优化优化BP神经网络3.1 BP神经网络参数设置3.2 阿基米德优化算…...
ubuntu20.04配置阿里的kubernetes源
不仅适用于kubernetes软件源的配置,同样适用于其他软件源 1、安装依赖 sudo apt-get update # apt-transport-https may be a dummy package; if so, you can skip that package sudo apt-get install -y apt-transport-https ca-certificates curl 2、配置gpg签名…...
【运维】一些团队开发相关的软件安装。
gitlab 安装步骤 (1) 下载镜像,并且上传到服务器 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (2)rpm -i gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm (3)安装成功后…...
互联网Java工程师面试题·Java 并发编程篇·第七弹
目录 16、CAS 的问题 17、什么是 Future? 18、什么是 AQS 19、AQS 支持两种同步方式: 20、ReadWriteLock 是什么 21、FutureTask 是什么 22、synchronized 和 ReentrantLock 的区别 23、什么是乐观锁和悲观锁 24、线程 B 怎么知道线程 A 修改了…...
SQL语句常见分类
SQL是Structured Query Language(结构化查询语言)的简写。 Structured发音 SQL 是关系型数据库管理系统的标准语言,如Oracle、MySQL、Microsoft SQL Server。 DDL DDL是Data Definition Language(数据定义语言)的简…...
SpringBoot通过配置切换注册中心(多注册中心nacos和eureka)
场景: 因项目需要,一个springcloud微服务工程需要同时部署到A,B两个项目使用,但A项目使用Eureka注册中心,B项目使用Nacos注册中心,现在需要通过部署时修改配置来实现多注册中心的切换。 解决思路: 如果同时…...
自动驾驶学习笔记(三)——场景设计
#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 场景设计平台 场景地图 场景基本…...
第 115 场 LeetCode 双周赛题解
A 上一个遍历的整数 模拟 class Solution { public:vector<int> lastVisitedIntegers(vector<string> &words) {vector<int> res;vector<int> li;for (int i 0, n words.size(); i < n;) {if (words[i] ! "prev")li.push_back(stoi…...
【IDE插件教学】华为云应用中间件系列—Redis实现(电商游戏应用)排行榜示例
云服务、API、SDK,调试,查看,我都行 阅读短文您可以学习到:应用中间件系列之Redis实现(电商游戏应用)排行榜示例 1 什么是DEVKIT 华为云开发者插件(Huawei Cloud Toolkit)&a…...
Linux:mongodb数据库源码包安装(4.4.25版本)
环境 系统:centos7 本机ip:192.168.254.1 准备的mongodb包 版本 : 4.4.25 全名称:mongodb-linux-x86_64-rhel70-4.4.25.tgz 下载源码包 Download MongoDB Community Server | MongoDBhttps://www.mongodb.com/try/downloa…...
pdf怎么合并在一起?
pdf怎么合并在一起?对于pdf合并这个问题,有的小伙伴想很简单,只需要将文件直接复制再其中的一个后面不就完事了吗。其实不然,因为我们如果要是需要将很多文件进行合并的话,就会产生很多问题的。总之,在现在…...
杀死僵尸进程ZooKeeperMain
关闭Hadoop后jps发现还有个进程ZooKeeperMain没有关闭,使用kill -9 <>也没有用,这种就是僵尸进程,需要用父进程ID来杀死 解决方法 话不多说,直接上解决方案, 1. 第一步 清楚需要关闭的进程ID,我…...
JavaScript class和function的区别
待整理: 一 二 Class 组件和 Function 组件是 React 中创建组件的两种主要方式。他们在语法和功能上有一些不同。以下分点是 Class 组件和 Function 组件在不同方面的对比: 1. 语法结构 Class 组件: import React, { Component } from …...
MySQL8.0修改mysql允许远程连接
1、连接服务器: mysql -u root -p2、看当前所有数据库:show databases; 3、进入mysql数据库:use mysql; 4、查看mysql数据库中所有的表:show tables; 5、查看user表中的数据:select Host, User,Password from user; 6、修改us…...
【算法训练-排序算法 二】【手撕排序】快速排序、堆排序、归并排序
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【手撕排序系列】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…...
C# RestoreFormer 图像修复
效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…...
yolov5+车辆重识别【附代码】
本篇文章主要是实现的yolov5和reid结合的车辆重识别项目。是在我之前实现的yolov5_reid行人重识别的代码上修改实现的baseline模型。 目录 相关参考资料 数据集说明 环境说明 项目使用说明 vehicle reid训练 yolov5车辆重识别 从视频中获取想要检测的车(待检测车辆) 车…...
如何用Obsidian Image Converter实现图像高效管理?超实用技巧分享
如何用Obsidian Image Converter实现图像高效管理?超实用技巧分享 【免费下载链接】obsidian-image-converter ⚡️ Convert, compress, resize, annotate, markup, draw, crop, rotate, flip, align images directly in Obsidian. Drag-resize, rename with variab…...
告别图库!用LiuJuan Z-Image为文章博客自动生成配图(保姆级教程)
告别图库!用LiuJuan Z-Image为文章博客自动生成配图(保姆级教程) 1. 为什么你需要这个工具? 作为一名内容创作者,我深知找配图的痛苦。记得上周为了给一篇技术文章配图,我花了整整40分钟在图库里翻找&…...
ESP32S3-Cam + MPU6050 DMP移植避坑实录:从编译报错到姿态数据稳定输出的完整流程
ESP32S3-Cam与MPU6050 DMP移植实战:从编译报错到稳定姿态解算的全流程解析 当ESP32S3-Cam遇上MPU6050的DMP(数字运动处理器)功能,本应是物联网项目中实现低成本姿态检测的完美组合。但实际移植过程中,开发者往往会遭遇…...
M2LOrder模型在AI编程助手场景的应用:代码注释情感分析
M2LOrder模型在AI编程助手场景的应用:代码注释情感分析 1. 引言 你有没有在代码注释里写过“这里有个天坑,后面的人小心”或者“TODO: 这个逻辑太绕了,得重构”?这些看似随手的吐槽,其实藏着开发者最真实的情绪。代码…...
Ostrakon-VL-8B功能体验:图文对话模型在零售场景的真实表现
Ostrakon-VL-8B功能体验:图文对话模型在零售场景的真实表现 1. 零售场景下的AI助手需求 在零售行业,每天都有大量需要人工处理的视觉任务:商品识别、货架检查、库存盘点、价格标签核对等。传统方法要么依赖人工检查效率低下,要么…...
LoRA训练助手入门解析:为什么权重排序对LoRA训练效果影响显著
LoRA训练助手入门解析:为什么权重排序对LoRA训练效果影响显著 1. 认识LoRA训练助手 如果你正在尝试训练自己的AI绘画模型,可能会遇到一个常见问题:为什么同样的图片,用不同的标签训练出来的效果差距那么大?这就是我们…...
Element UI表格样式改造避坑指南:透明化后文字看不清、边框错位怎么办?
Element UI表格透明化实战:解决文字模糊与样式错位的专业方案 当我们在Vue项目中采用Element UI的el-table组件实现透明化效果时,经常会遇到一些棘手的样式问题。本文将深入分析四个典型场景的成因,并提供经过实战检验的解决方案。 1. 透明背…...
思源宋体免费商用字体:设计师的终极开源字体解决方案
思源宋体免费商用字体:设计师的终极开源字体解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量中文字体而烦恼吗?Source Han Se…...
网络基础知识整理(精简通用版)20260331-001篇
文章目录 网络基础知识整理(精简通用版) 一、网络基本概念 二、网络拓扑结构 三、OSI 七层模型(核心参考) 四、TCP/IP 模型(实际互联网标准) 五、IP 地址基础 六、传输层协议(TCP vs UDP) TCP(传输控制协议) UDP(用户数据报协议) 七、常见网络协议与端口 八、网络设…...
Mac用户的移动Win10工坊:从WTG配置到驱动、激活、文件共享的完整避坑指南
Mac用户的移动Win10工坊:从WTG配置到驱动、激活、文件共享的完整避坑指南 当Mac用户需要运行Windows应用时,双系统方案往往是最佳选择。而通过Windows To Go(WTG)技术将Win10安装在移动硬盘上,不仅保留了Mac原生系统的…...
