尝试将属于不同事务的对象与独立的db_sessions混合



我在下面的func2中得到了这个错误:

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

我知道也有类似的问题,但公认的答案不适用于我。我不会重用另一个db_session中的对象。我连续有两个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之间仍在维护什么上下文?

已解决

func1的深处,有一个用lru_cache修饰的函数,它返回了一个Entity实例。func2将在新事务中读取相同的实体,但LRU缓存返回一个附加到先前db_session的缓存版本。

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

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

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

最新更新