一周学会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")

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

相关推荐
waterHBO20 分钟前
python 爬虫 selenium 笔记
爬虫·python·selenium
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
AIAdvocate3 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼3 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
FreakStudio5 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
redcocal6 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
artificiali7 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
RaidenQ7 小时前
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
图像处理·python·算法·课程设计
花生了什么树~.7 小时前
python基础知识(六)--字典遍历、公共运算符、公共方法、函数、变量分类、参数分类、拆包、引用
开发语言·python
Trouvaille ~8 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算