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

Python 上下文管理器、多个函数调用和事务,python,database,oracle,Python,Database,Oracle,说我愿意: with my_connection: o.first_call() 其中,my\u connection的\u退出\u方法调用回滚 和执行调用中的o.first\u调用和j.second\u调用,后者本身调用z.third\u调用。假设z.third\u call成功将记录插入数据库,j.second\u call也成功插入记录,但o.first\u call失败。我将回滚到第一次输入我的\u连接上下文之前的状态,还是回滚到o.first\u call和j.second\

说我愿意:

with my_connection:
    o.first_call()
其中,
my\u connection
\u退出\u
方法调用回滚

和执行调用中的
o.first\u调用
j.second\u调用
,后者本身调用
z.third\u调用
。假设
z.third\u call
成功将记录插入数据库,
j.second\u call
也成功插入记录,但
o.first\u call
失败。我将回滚到第一次输入我的\u连接上下文之前的状态,还是回滚到
o.first\u call
j.second\u call
之间的状态

编辑:说清楚一点,我希望整个事情都能回到我打电话之前


EDIT2:我希望如果在
\uuuuu enter\uuuuuu
中有什么魔法我可以做的话,某种上下文可以说,看,无论调用什么都是一个大事务。

事务将回滚到最后一次
提交
调用

Per:

.commit()

将任何挂起的事务提交到数据库

.rollback()

。。。使数据库回滚到任何 未决交易


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

但是如果插入成功,则说
j.second\u call
提交,那么
o.first\u call
的回滚将使我返回错误的位置。我怎样才能使整个事情成为一个事务呢?不要在
j.second\u call()
之后调用commit。是的,但我希望如果在
\uuuu enter\uuuuuu
中我能做一些魔术,某种上下文可以说,看,无论被称为什么都是一个大事务。我不认为这样的事情存在,在
\uuuuuuuuuuuuuuuuuu
中保存数据库文件的副本,然后在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
中关闭服务器、替换数据库文件并重新启动服务器。那太难看了。。。我不是建议你那样做但这就是恢复提交所需要的。解决方案是在确定事务应该提交之前不要调用
commit
。在db端设置某种上下文怎么样,这样的事情会存在吗?