当前位置: 代码迷 >> 综合 >> Django(11): 事务 transaction.atomic
  详细解决方案

Django(11): 事务 transaction.atomic

热度:102   发布时间:2023-11-21 17:46:31.0

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 中事务的使用 - 太虚真人 - 博客园

  相关解决方案