Django-使用事务处理多表联动数据

Django事务介绍

  1. 以在Django中实现保存订单数据为例,涉及多张数据表的修改:增加订单数据及订单中包含的商品数据,减少商品表对应商品数量,增加商品销量。对这些数据的修改应该是一个整体,即要么都成功,要么都失败。
  2. 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语句实现事务。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容