Django的默认行为是在自动提交模式下运行。除非事务处于活动状态,否则每个查询都会立即提交到数据库。
自定义事务处理
方法一:全局配置对一整个http请求内数据库操作进行事务管理
同一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。如果要对某个http不使用setting中全局事务配置,可以用non_atomic_requests修饰器
'ATOMIC_REQUESTS': True,
DATABASES = {'default': {……'ATOMIC_REQUESTS': True, }}
@transaction.non_atomic_requests
from django.db import transactionclass xxx(xxxView):@transaction.non_atomic_requestsdef post(self, request, *args, **kwargs):pass...
在调用视图函数之前,Django启动事务。如果产生的响应没有问题,则Django提交事务。如果视图产生异常,Django将回滚事务。
以上配置所有请求涉及的mysql操作都会进行事务管理,没有精准的控制,会影响性能,不建议使用。
方法二:atomic
装饰器对整个view进行事务管理
@transaction.atomic# transaction.atomic装饰器可以保证该函数中所有的数据库操作都在一个事务中。def post(self, request):# 数据库操作1。。。# 数据库操作2。。。return HttpResponse('ok')
方法三:atomic 对代码块进行事务管理
with transaction.atomic():try:save_id = transaction.savepoint()self.perform_create(serializer)except Exception as e:transaction.savepoint_rollback(save_id)return Response(ReturnMsg(data=None, msg=str(e)).errodict())transaction.savepoint_commit(save_id)return Response(ReturnMsg(data=serializer.data).dict())
参考:
Database transactions | Django documentation | Django
Django 中事务的使用 - 太虚真人 - 博客园