Django中的事务

news/2024/10/9 0:34:08/

1 开启全局的事务

python">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请求开始时自动开启一个数据库事务,并在请求结束时提交或回滚该事务。这提供了一种方便的方式来确保数据库操作的原子性,即要么全部成功,要么全部失败。

python"># 设置中默认开启全局事务
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请求时,它都会自动开启一个数据库事务。如果请求成功完成并且没有发生任何异常,那么事务会在请求结束时自动提交。如果请求期间发生了异常,那么事务会被回滚,从而撤销该请求所做的所有数据库更改。
在这里插入图片描述

python">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 开启视图函数的事务

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

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

python">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 事务保存点

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

python">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 开启事务回调

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

python">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.ppmy.cn/news/1441416.html

相关文章

线程、线程组、线程池、锁、事务、分布式

1.线程 Thread类 ,可以继承他,复写run方法,然后new一个对象,调用start方法启动。 2.runnable接口,他单独把run方法定义出来了,可以自己实现一个runnable接口,然后new一个runnable对象给到threa…

Python --- 新手小白自己动手安装Anaconda+Jupyter Notebook全记录(Windows平台)

新手小白自己动手安装AnacondaJupyter Notebook全记录 这两天在家学Pythonmathine learning,在我刚刚入手python的时候,我写了一篇新手的入手文章,是基于Vs code编译器的入手指南,里面包括如何安装python,以及如何在Vs…

PDF 正确指定页码挂载书签后,书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另做一篇原因是一篇文章附带一个与该文章主题不相关的问题时,不利于被遇到该问题的人快速搜索发现以解决其遇到的…

QT客户端开发的技术难点

QT是一种功能强大且灵活的跨平台应用程序开发框架,但也存在一些技术难点,需要开发者仔细考虑和克服。以下是一些常见的QT开发技术难点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 跨平台兼容性 QT框架…

使用frp实现内网穿透教程

文章目录 简介frp 是什么?为什么选择 frp? 概念工作原理代理类型 内网穿透教程服务端安装和配置本地Windows(客户端)安装和配置本地Linux虚拟机(客户端)安装和配置使用 systemd 管理服务端注意事项 简介 f…

分布式与一致性协议之CAP(一)

CAP理论 概述。 在开发分布式系统的时候,会遇到一个非常棘手的问题,那就是如何根据业务特点,为系统设计合适的分区容错一致性模型,以实现集群能力。这个问题棘手在当发生分区错误时,应该如何保障系统稳定运行而不影响…

面试八股——RabbitMQ

消息丢失问题 消息确认机制 生产者与MQ之间的消息确认: 当MQ成功接收消息后,会返回给生产者一个确认消息。如果在规定时间内生产者未收到确认消息,则任务消息发送失败。 MQ与消费者之间的消息确认: 当MQ成功接收消息后&#…

常用设计模式简介

设计模式是在软件设计中常见问题的通用可重用解决方案。它们分为三大类:创建型模式、结构型模式和行为型模式。下面是这三类中一些常用设计模式的概述: 创建型模式 单例模式(Singleton) 保证一个类只有一个实例,并提供…