首页 > 解决方案 > 尝试将属于不同事务的对象与独立的 db_sessions 混合

问题描述

我在func2下面收到此错误:

pony.orm.core.TransactionError: An attempt to mix objects belonging to different transactions

我知道有一个类似的问题,但接受的答案不适用于我。我没有重用来自另一个 db_session 的对象。我连续有 2 个 db_sessions 实际上具有完全不同的功能:

def func1():
    with db_session:
        # Self contained operation
    return

def func2():
    with db_session:
        # Different self contained operation
    return

def main():
    func1()
    func2()

我没有将任何参数从第一个函数传递给第二个函数;它们是完全解耦的。我的理解是,一旦退出 db_session 上下文,事务就会提交。一个新的 db_session 会启动一个新的身份映射和事务,因此这两个函数调用之间不应该存在持久的 ORM 依赖关系。

如果我只是运行func2(),它运行良好。它似乎只在调用func1().

如果交易是没有共享数据的独立交易,有人可以解释如何混合交易吗?第一个 db_session 如何仍然影响第二个?Pony 还在 db_sessions 之间维护什么上下文?

标签: pythonpython-3.xponyorm

解决方案


解决了

内部深处func1有一个装饰有lru_cache返回实体实例的函数。func2将在新事务中读取相同的实体,但 LRU 缓存返回的是附加到前一个db_session.

当我在 之后清除缓存func1时,错误消失了:

def main():
    func1()
    cached_func.cache_clear() # <- Clear Cache
    func2()

经验教训:运行多个单独的 db_session 时要注意缓存。他们可以引入隐藏对象混合。


推荐阅读