上下文管理器、多函数调用与事务

1 投票
1 回答
654 浏览
提问于 2025-04-18 01:37

假设我这样做:

with my_connection:
    o.first_call()

这里的 my_connection__exit__ 方法会执行回滚操作。

o.first_call 在执行时会调用 j.second_call,而 j.second_call 又会调用 z.third_call。假设 z.third_call 成功地在数据库中插入了一条记录,j.second_call 也成功插入了一条记录,但 o.first_call 出了问题。那么我会回滚到进入 my_connection 之前的状态,还是会回滚到 o.first_callj.second_call 之间的状态呢?

补充说明:我希望整个过程能回滚到我第一次调用 o.first_call 之前的状态。

补充说明2:我希望在 __enter__ 方法中能做点什么魔法,能有一种上下文来说明,看看不管调用什么,都是一个大事务。

1 个回答

1

事务会回滚到上一次的 commit 调用。

根据 数据库API规范 v2.0

.commit()

把所有待处理的事务提交到数据库。

.rollback()

... 会让数据库回到任何待处理事务的开始状态。

所以,这要看你说的“成功插入”是什么意思。如果插入操作已经通过 commit 完成了,那么回滚就不会删除这个插入。但是,如果没有调用 commit,那么这个插入就会被回滚掉。

撰写回答