[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}")
相关推荐
Teable任意门互动9 分钟前
AI原生开源多维表格有哪些?主流开源多维表格对比解析
数据库·开源·excel·钉钉·飞书·开源软件·ai-native
淇奥727 分钟前
【MyBatis-Plus】MyBatis-Plus 学习笔记
后端
_code_bear_32 分钟前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
TDengine (老段)38 分钟前
MNode 内部机制深度解析 — SDB、事务引擎与 DDL 处理全链路
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
这个DBA有点耶38 分钟前
数据库上云 vs 自建:从成本到人力的三维对比与决策框架
数据库·经验分享·sql·创业创新·dba
shizhan_cloud44 分钟前
MySQL 索引优化 + 慢查询日志
数据库·mysql
用户8356290780511 小时前
使用 Python 在 PowerPoint 中添加并控制音频播放
后端·python
Drache_long1 小时前
MySQL数据库(故障排除)
数据库·mysql
2303_821287381 小时前
如何清洗SQL输入数据_使用框架内置的ORM处理数据交互
jvm·数据库·python
清风雅雨1 小时前
AI编程:OA流程明细表中多个金额字段由整数改为2位小数
数据库·ai编程