[Django学习]如何在Django中声明“事务”(包括事务回滚)

一、事务概念

事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。比如某软件的转账功能:现在用户A要给B转账300块,其流程为,先检查A的余额,若余额大于300,则将A的余额减去300,之后将B的余额增加300。

在上述例子中,A余额减300,和B余额增加300这两个操作要么都执行,要么一个也不执行,否则可能会出现A的余额减300后,B的余额没有变化,或是B的余额凭空增加300,但A的余额还是不变。转账这一系列操作为一个事务。

但若一开始发现A的余额不足300块,则对事务进行回滚,取消之后的一系列操作。

二、Django声明事务的两种方法

1.装饰器方法

使用@transaction.atomic装饰器来装饰一个视图函数或方法。在这个函数或方法内部的所有数据库操作都将在一个事务中执行。如下面这个代码:

python 复制代码
from django.db import transaction  
from .models import Account  
  
@transaction.atomic  
def transfer_funds(from_account_id, to_account_id, amount):  
    try:  
        # 从A账户中减去金额  
        from_account = Account.objects.get(pk=from_account_id)  
        if from_account.balance < amount:  # 余额不足,回滚
            raise ValueError("账户余额不足")  
        from_account.balance -= amount  
        from_account.save()  
  
        # 向账户B中增加金额  
        to_account = Account.objects.get(pk=to_account_id)  
        to_account.balance += amount  
        to_account.save()  
  
    except Exception as e:  
        # 如果在此过程中发生任何异常,Django会自动回滚事务  
        print(f"An error occurred: {e}")    

    # 代码块成功执行完毕,Django会自动提交事务

2.上下文管理器:

也可以不把整个视图作为事务处理,而是在一个代码块里使用transaction.atomic()上下文管理器。

python 复制代码
from django.db import transaction  
from .models import Account  
  
def transfer_funds(from_account_id, to_account_id, amount):  
    try:  
        with transaction.atomic():  
            #  这里放刚刚转账操作的代码  
    except Exception as e:  
        print(f"操作发生错误: {e}")
相关推荐
小智RE0-走在路上16 分钟前
Python学习笔记(13) --Mysql,Python关联数据库
数据库·python·学习
程序员码歌21 分钟前
短思考第266天,玩IP路上的几点感悟,这几点很重要!
前端·后端·创业
x66ccff25 分钟前
Claude Code 安装方法
android·java·数据库
嘟嘟w27 分钟前
MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
数据库·mysql
码农BookSea27 分钟前
响应式编程不只有概念!万字长文 + 代码示例,手把手带你玩转 RxJava
后端
JH灰色33 分钟前
【大模型】-LlamaIndex框架(与LangChain区别)
数据库·langchain
没有bug.的程序员39 分钟前
服务治理体系:从零到一的全景落地指南
java·开发语言·数据库·微服务·架构
毕设源码-郭学长40 分钟前
【开题答辩全过程】以 基于SpringBoot的足球运动员训练计划管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
ha_lydms40 分钟前
4、Spark 函数_m/n/o/p/q/r
大数据·数据库·python·sql·spark·数据处理·dataworks
草莓熊Lotso42 分钟前
2025年12月远程协作平台全景评测:智能连接时代的效率革命
运维·服务器·数据库