【问题标题】:Context manager, multiple function calls and transactions上下文管理器、多个函数调用和事务
【发布时间】:2014-04-06 20:02:14
【问题描述】:

说我愿意:

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__ 中做一些魔术,某种上下文可以说,看看所谓的任何东西都是一笔大交易。

【问题讨论】:

    标签: python database oracle


    【解决方案1】:

    事务将回滚到最后一次commit 调用。

    Database API Specification v2.0:

    .commit()

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

    .rollback()

    ... 使数据库回滚到任何 待处理的交易。

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

    【讨论】:

    • 但是说j.second_call在插入成功后提交,那么o.first_call的回滚会让我回到错误的地方。我怎样才能使整个事情成为交易?
    • 不要在j.second_call()之后调用commit。
    • 是的,但我希望如果我可以在 __enter__ 中施展魔法,可以在某种上下文中说,看看所谓的什么都是一笔大交易。
    • 我认为不存在这样的事情,除了在__enter__中保存数据库文件的副本,然后在__exit__中关闭服务器,替换数据库文件,然后重新启动服务器。那太丑陋了……我不建议这样做! - 但这就是恢复提交所需要的。解决方案是在确定事务应该提交之前不要调用commit
    • 在数据库端设置某种上下文怎么样,这样的事情是否存在?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多