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

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

相关推荐
不去幼儿园6 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书5 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼8 小时前
Python 神经网络项目常用语法
python
一念之坤9 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl7812279 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder9 小时前
Python入门(12)--数据处理
开发语言·python
LKID体10 小时前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j