上下文管理器、多函数调用与事务
假设我这样做:
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_call
和 j.second_call
之间的状态呢?
补充说明:我希望整个过程能回滚到我第一次调用 o.first_call
之前的状态。
补充说明2:我希望在 __enter__
方法中能做点什么魔法,能有一种上下文来说明,看看不管调用什么,都是一个大事务。
1 个回答
1
事务会回滚到上一次的 commit
调用。
根据 数据库API规范 v2.0:
.commit()
把所有待处理的事务提交到数据库。
.rollback()
... 会让数据库回到任何待处理事务的开始状态。
所以,这要看你说的“成功插入”是什么意思。如果插入操作已经通过 commit
完成了,那么回滚就不会删除这个插入。但是,如果没有调用 commit,那么这个插入就会被回滚掉。