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端设置某种上下文怎么样,这样的事情会存在吗?