上下文管理器,多个函数调用和事务

时间:2014-04-06 20:02:15

标签: python database oracle

我说:

with my_connection:
    o.first_call()

其中my_connection' __exit__方法要求回滚

执行调用o.first_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

之前,整个事情都会回滚

EDIT2:我希望我能在__enter__做一些魔术,某种情况可以说,看看所谓的是一个大事。

1 个答案:

答案 0 :(得分:1)

交易将回滚到最后一次commit电话。

Database API Specification v2.0

  

.commit()

     

将任何待处理的事务提交到数据库。

     

.rollback()

     

...导致数据库回滚到任何一个的开头   待处理的交易

所以这取决于“成功插入”的含义。如果通过调用commit完成插入,则回滚将不会删除插入。但是,如果没有提交,则插入将被回滚。