Django事务介绍
- 以在Django中实现保存订单数据为例,涉及多张数据表的修改:增加订单数据及订单中包含的商品数据,减少商品表对应商品数量,增加商品销量。对这些数据的修改应该是一个整体,即要么都成功,要么都失败。
- Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交。所以我们需要在保存订单中自己控制数据库事务的执行流程。
Django中事务的使用
1. Django中可以通过django.db.transaction
模块提供的atomic
来定义一个事务。
2. django与MySQL中事务的比较
django中事务的使用原理与MySQL中完全一致,且标记语言也很相似。
MySQL:
start:事务开始标记
commit:提交事务
roolback:回滚事务
Django:先导入django.db.transaction模块
transaction.savepoint():设置事务保存点
transaction.savepoint_commit():提交事务
transaction.save_rollback():回滚事务至保存点
3. Django中提供两种方法实现事务
3.1 装饰器方法
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# 这些代码会在一个事务中执行
......
装饰器方法自动将一个视图函数整体划归为一个事务,优点是使用简单,缺点是范围太大不够灵活,也无法作用于类视图。
3.2 with语法
# 执行事务的代码块放在with下,禁止自动提交事务
with transaction.atomic():
# 开启事务点
sid = transaction.savepoint()
# 回滚事务
if...:
transaction.save_rollback(sid)
# 提交事务
transaction.savepoint_commit(sid)
"""
订单提交逻辑示例:
开启事务点
创建订单对象
查询商品
判断商品库存是否充足
if 不充足:回滚
无问题再整体提交事务
"""
with语句可以灵活的有选择性的把某些MySQL数据库的操作看做一个事务。而且不用关心视图的类型。
因此,大多数情况下优先选用的是with语句实现事务。