一:事务
使用场景
在电商项目中必备的功能之一用户选择商品进行下单,在用户下单难免会涉及到第三方使用第三方平台进行支付 例如:支付宝
在订单支付过程中肯定会设计到两张表,订单表以及订单信息表,订单表:订单号,订单时间,用户信息等,订单商品表:记录订单中的商品 价格 标题等
在用户下单的时候肯定设计到数据的保存,但是上述两个表其实是有逻辑关联的,只有订单表下单的成功的时候,订单商品表才应该保存到数据库中
因此上述两个表涉及到要么同时成功,要么同时失败,有点需要用到数据库的事务
使用方式
在Django中可以通过django.db.transaction
模块提供的atomic
来定义一个事务,atomic
提供两种用法,
一种是装饰器
from django.db import transaction @transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行
一种是with语句。
from django.db import transaction def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 ... with transaction.atomic(): # 这部分代码会在事务中执行
在Django中,还提供了保存点的支持,可以在事务中创建保存点来记录数据的特定状态,数据库出现错误时,可以恢复到数据保存点的状态
from django.db import transaction # 创建保存点 save_id = transaction.savepoint() # 回滚到保存点 transaction.savepoint_rollback(save_id) # 提交从保存点到当前状态的所有数据库事务操作 transaction.savepoint_commit(save_id)