一周学会Django5 Python Web开发 - Django5 ORM数据库事务

锋哥原创的Python Web开发 Django5视频教程:

2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计50条视频,包括:2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~、第2讲 Django5安装、第3讲 Django5创建项目(用命令方式)等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV14Z421z78C/事务是指作为单个逻辑执行的一系列操作,这些操作具有原子性,即这些操作要么完全执行,要么完全不执行。事务处理可以确保事务性单元内的所有操作都成功完成,否则不会执行数据操作。 事务应该具有4个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation),持久性(Durability),这4个属性通常称为ACID特性,说明如下。

  • 原子性:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

  • 一致性:事务必须使数据库从某个一致性状态变到另一个一致性状态,一致性与原子性是密切相关的。

  • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他事务是隔离的,各个事务之间不能互相干扰。

  • 持久性:持久性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变应该是永久性的,其他操作或故障不应该对其有任何影响。

我们先来做一个用户转账的事例:

models.py下新建AccountInfo账户信息模型

python 复制代码
class AccountInfo(models.Model):
    user = models.CharField(max_length=20)
    account = models.FloatField()
​
    class Meta:
        db_table = "t_account"
        verbose_name = "用户账户信息"  # 给模型取个直观的名字

然后我们执行: python manage.py makemigrations 生成数据库迁移文件,再执行:python manage.py migrate 执行迁移文件,同步到数据库中;生成了t_account表

表里,我们加两个测试数据:

views.py里,我们写一个测试转账测试实例:

python 复制代码
def transfer2(request):
    """
    模拟转账
    :param request:
    :return:
    """
    a1 = AccountInfo.objects.filter(user='张三')
    a1.update(account=F('account') + 100)
    a2 = AccountInfo.objects.filter(user='李四')
    a2.update(account=F('account') - 100)
    return HttpResponse("OK")

urls.py里配置下映射:

python 复制代码
path('transfer2/', helloWorld.views.transfer2),

测试,浏览器输入:http://127.0.0.1:8000/transfer2/,测试成功。

这里涉及到2个数据库操作,假如第二个数据库操作失败,那张三就多了100,但是李四钱没少,这时候金融账务就对不上了,除了问题。

我们来模拟下吧,转出代码,除以0:

再运行测试下,页面报错,

李四的钱也没被扣,

这时候,Django5提供的事务功能就派上用场了。

Django5主要有4个事务方法:

  • atomic():在视图函数或视图类里使用事务。

  • savepoint():开启事务。

  • savepoint_rollback():回滚事务。

  • savepoint_commit():提交事务。

我们用上事务,改下代码:

python 复制代码
@transaction.atomic
def transfer(request):
    """
    模拟转账
    :param request:
    :return:
    """
    # 开启事务
    sid = transaction.savepoint()
    try:
        a1 = AccountInfo.objects.filter(user='张三')
        a1.update(account=F('account') + 100)
        a2 = AccountInfo.objects.filter(user='李四')
        a2.update(account=F('account') - 100 / 0)
        # 提交事务 (如不设置,当程序执行完成后,会自动提交事务)
        transaction.savepoint_commit(sid)
    except Exception as e:
        print("异常信息:", e)
        # 事务回滚
        transaction.savepoint_rollback(sid)
    return HttpResponse("OK")

我们再测试下,发现回滚了,钱都没有变化;

相关推荐
小白学大数据19 分钟前
深度探索:Python 爬虫实现豆瓣音乐全站采集
开发语言·爬虫·python·数据分析
用户67570498850220 分钟前
Celery 太重了?这可能是你一直在找的 asyncio 任务队列
后端·python·消息队列
Cloud_Shy61820 分钟前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十一章 Python 包跟踪器 下篇)
前端·后端·python·数据分析·excel
程序员榴莲22 分钟前
网络编程入门 Python Socket 实现一个简单的用户认证系统
服务器·网络·python
知识分享小能手31 分钟前
Flask入门学习教程,从入门到精通, 认识Flask路由 — 知识点详解 (2)
python·学习·flask
AI棒棒牛31 分钟前
YOLO26改进创新 | 全网首发!VECA弹性核心注意力重塑全局建模,线性复杂度增强检测骨干,嘎嘎创新!
python·yolo·目标检测·yolo26·主干改进
DFT计算杂谈34 分钟前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
庚昀◟43 分钟前
ClaudeCode安装教程,基础使用、进阶推荐
人工智能·python·ai
deephub1 小时前
告别脆弱的单体应用,用多智能体网络构建稳定的生产力工具
人工智能·python·大语言模型·多智能体
烟雨江南aabb1 小时前
Python第六弹:python爬虫篇:什么是爬虫
开发语言·爬虫·python