31、django的事务_transaction
2020-08-20 本文已影响0人
猪儿打滚
背景
在写项目时,特别是view中,我们可能需要进行多个业务操作(不仅仅是操作sql)。比如说:在编辑case的接口,我需要对case对应的interface进行新增/修改/删除操作,以及对case进行更新操作;我需要这样实现:把这四个步骤当成个事务,当其中有一个步骤失败,则回滚不执行;只有都成功时,才执行这四个步骤。
django事务类库:django.db.transaction
atomic提供两种方案实现事务
- 1、装饰器用法:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# 这些代码会在一个事务中执行
......
装饰器用法:整个视图中所有 MySQL 数据库的操作都看做一个事务,范围太大,不够灵活。而且无法直接作用于类视图
- 2、with 语句用法:
from django.db import transaction
def viewfunc(request):
# 这部分代码不在事务中,会被 Django 自动提交
......
with transaction.atomic():
# 这部分代码会在事务中执行
......
with 语句用法:可以灵活的有选择性的把某些 MySQL 数据库的操作看做一个事务。而且不用关心视图的类型。
transaction
三个语句的使用
from django.db import transaction
with transaction.atomic():
# 这部分代码会在事务中执行
# 创建保存点
save_id = transaction.savepoint()
try:
....
except:
# 回滚到保存点
transaction.savepoint_rollback(save_id)
# 提交从保存点到当前状态的所有数据库事务操作
transaction.savepoint_commit(save_id)