锋哥原创的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账户信息模型
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里,我们写一个测试转账测试实例:
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里配置下映射:
path('transfer2/', helloWorld.views.transfer2),
测试,浏览器输入:http://127.0.0.1:8000/transfer2/
,测试成功。
这里涉及到2个数据库操作,假如第二个数据库操作失败,那张三就多了100,但是李四钱没少,这时候金融账务就对不上了,除了问题。
我们来模拟下吧,转出代码,除以0:
再运行测试下,页面报错,
李四的钱也没被扣,
这时候,Django5提供的事务功能就派上用场了。
Django5主要有4个事务方法:
-
atomic():在视图函数或视图类里使用事务。
-
savepoint():开启事务。
-
savepoint_rollback():回滚事务。
-
savepoint_commit():提交事务。
我们用上事务,改下代码:
@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")
我们再测试下,发现回滚了,钱都没有变化;