Django中为所有API配置全局原子数据库事务的方案问询
Django全局启用请求级原子事务的解决方案
一、先排查ATOMIC_REQUESTS未生效的常见原因
ATOMIC_REQUESTS是Django官方提供的全局事务方案,绝大多数场景下可正常生效,未生效通常是以下原因导致:
- 异常被手动捕获未抛出:Django默认仅当请求处理过程中抛出未捕获的异常时才会回滚事务。如果你的视图/中间件中捕获了数据库操作相关异常,且未重新抛出,也没有手动调用
transaction.set_rollback(True),事务会正常提交不会回滚。 - 异步视图版本不兼容:Django 3.2及以上版本才支持异步视图的
ATOMIC_REQUESTS配置,低版本异步视图下该参数不生效。 - 多数据库未全量配置:如果项目使用了多数据库路由,需要给所有用到的数据库配置都加上
'ATOMIC_REQUESTS': True才会全局生效。
二、自定义中间件实现全局事务(更可控)
如果需要自定义事务触发逻辑,或者ATOMIC_REQUESTS无法满足你的场景,可以通过自定义中间件全局包裹事务,步骤如下:
- 在任意应用下新建
middleware.py文件,写入以下代码:
from django.db import transaction from django.http import HttpResponseServerError class GlobalAtomicTransactionMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): try: with transaction.atomic(): response = self.get_response(request) # 自定义回滚逻辑:示例为状态码>=400时强制回滚 if response.status_code >= 400: transaction.set_rollback(True) return response except Exception as e: # 异常默认自动回滚,可自行调整异常处理逻辑 return HttpResponseServerError()
- 在
settings.py的MIDDLEWARE列表顶部添加该中间件,确保所有请求处理逻辑都被事务包裹:
MIDDLEWARE = [ # 替换为你实际的应用名称 'myapp.middleware.GlobalAtomicTransactionMiddleware', # 其余原有中间件保持不变 'django.middleware.security.SecurityMiddleware', ... ]
三、注意事项
- 不需要原子事务的接口,可以用
@transaction.non_atomic_requests装饰器标记对应的视图,上述两种方案都会自动排除标记的视图。 - 不要在事务中执行耗时的非数据库操作(如调用第三方接口、上传大文件等),避免产生长事务导致数据库性能下降甚至死锁,这类操作建议移到事务提交后执行。
内容的提问来源于stack exchange,提问作者Nivedita
相关产品推荐
相关产品推荐

