django中实现事务的几种方式

1.实现事务的三种方式

1.1 全局开启事务---> 全局开启事务,绑定的是http请求响应整个过程

python 复制代码
DATABASES = {
         'default': {
              #全局开启事务,绑定的是http请求响应整个过程
             'ATOMIC_REQUESTS': True, 
         }
    }
from django.db import transaction
    # 局部禁用事务
@transaction.non_atomic_requests
def seckill(request):
   return HttpResponse('秒杀成功')

1.2 一个视图函数在一个事物中

python 复制代码
 # fbv开启
    from django.db import transaction
    @transaction.atomic
    def seckill(request):
        return HttpResponse('秒杀成功')
# cbv开启
from django.db import transaction
from rest_framework.views import APIView
class SeckillAPIView(APIView):
     @transaction.atomic
     def post(self, request):
         pass

1.3 局部使用事务

python 复制代码
from django.db import transaction
def seckill(request):
    with transaction.atomic():     #不用提交事务   with上下文管理器
        pass  # 都在一个事物中
    return HttpResponse('秒杀成功')

2 事物的回滚和保存点

python 复制代码
# 1 普通事务操作(手动操作)
transaction.atomic()  # 开启事务
transaction.commit()  # 提交事务
transaction.rollback() # 回滚事务

# 2 可以使用上下文管理器来控制(自动操作)
with transaction.atomic():  # 自动提交和回滚

保存点

在事务操作中,我们还会经常显式地设置保存点(savepoint)

一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的保存点

如果没有问题,就使用savepoint_commit方法提交事务

python 复制代码
from .models import Book
from django.db import transaction
def seckill(request):
    with transaction.atomic():
        # 设置回滚点,一定要开启事务
        sid = transaction.savepoint()
        print(sid)
        try:
            book = Book.objects.get(pk=1)
            book.name = '红楼梦'
            book.save()
        except Exception as e:
            # 如发生异常,回滚到指定地方
            transaction.savepoint_rollback(sid)
            print('出异常了,回滚')
        # 如果没有异常,显式地提交一次事务
        transaction.savepoint_commit(sid)
    return HttpResponse('秒杀成功')
transaction.atomic()  # 开启事务
sid = transaction.savepoint() # 设置保存点
transaction.savepoint_rollback(sid) # 回滚到保存点
transaction.savepoint_commit(sid) #提交保存点

3 事务提交后,执行某个回调函数

有的时候我们希望当前事务提交后立即执行额外的任务,比如客户下订单后立即邮件通知卖家

案例一

python 复制代码
def send_email():
    print('发送邮件给卖家了')
def seckill(request):
    with transaction.atomic():
        # 设置回滚点,一定要开启事务
        sid = transaction.savepoint()
        print(sid)
        try:
            book = Book.objects.get(pk=1)
            book.count = book.count-1
            book.save()
        except Exception as e:
            # 如发生异常,回滚到指定地方
            transaction.savepoint_rollback(sid)
        else:
            transaction.savepoint_commit(sid)     #提交事务
            transaction.on_commit(send_email)     #提交事务之后执行send_email函数
            
    return HttpResponse('秒杀成功')

案例二
transaction.on_commit(lambda: send_sms.delay('1898288322'))
#异步提交,利用celery提交异步任务
相关推荐
大学生毕业题目10 小时前
毕业项目推荐:83-基于yolov8/yolov5/yolo11的农作物杂草检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·杂草识别
Kyln.Wu10 小时前
【python实用小脚本-205】[HR揭秘]手工党逐行查Bug的终结者|Python版代码质量“CT机”加速器(建议收藏)
开发语言·python·bug
计算机毕业设计木哥10 小时前
Python毕业设计推荐:基于Django的饮食计划推荐与交流分享平台 饮食健康系统 健康食谱计划系统
开发语言·hadoop·spring boot·后端·python·django·课程设计
小草cys10 小时前
在树莓派集群上部署 Distributed Llama (Qwen 3 14B) 详细指南
python·llama·树莓派·qwen
数据科学作家13 小时前
学数据分析必囤!数据分析必看!清华社9本书覆盖Stata/SPSS/Python全阶段学习路径
人工智能·python·机器学习·数据分析·统计·stata·spss
HXQ_晴天14 小时前
CASToR 生成的文件进行转换
python
java1234_小锋15 小时前
Scikit-learn Python机器学习 - 特征预处理 - 标准化 (Standardization):StandardScaler
python·机器学习·scikit-learn
Python×CATIA工业智造15 小时前
Python带状态生成器完全指南:从基础到高并发系统设计
python·pycharm
向qian看_-_16 小时前
Linux 使用pip报错(error: externally-managed-environment )解决方案
linux·python·pip
Nicole-----16 小时前
Python - Union联合类型注解
开发语言·python