@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
相关产品推荐
相关产品推荐

