You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@transaction.atomic是否跟随函数调用?子函数报错会触发回滚吗?

Django @transaction.atomic 事务范围与回滚问题解答

核心结论

会触发事务回滚,@transaction.atomic装饰器会包裹整个执行流程——包括create函数内部调用的func_a中的所有数据库操作。

详细解释

@transaction.atomic基于线程本地事务上下文实现:

  • 进入被装饰的create函数时,会启动全局事务上下文,整个函数执行周期内(包括调用其他函数的过程),所有数据库操作都会纳入该事务。
  • 只要在这个上下文范围内(无论是create自身代码,还是它调用的func_a)抛出未被捕获的异常,整个事务就会触发回滚,所有已执行的数据库操作都会被撤销。

结合你给出的代码示例:

@transaction.atomic
def create(...):
    few queries...
    func_a()
    return

def func_a():
    also running few queries... 
  • 若func_a内的查询执行失败并抛出异常,且该异常未在func_a内部被捕获处理,异常会向上传播到create函数,触发@transaction.atomic的回滚逻辑,create和func_a中的查询都会被回滚。
  • 例外情况:如果func_a内部自行捕获异常并阻止其传播,事务不会触发回滚,因为atomic仅在上下文结束前检测到未处理异常时才会执行回滚。

内容的提问来源于stack exchange,提问作者vukojevicf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:48:40