python - 尝试将属于不同事务的对象与独立的 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 之间维护什么上下文?
解决方案
解决了
内部深处func1
有一个装饰有lru_cache
返回实体实例的函数。func2
将在新事务中读取相同的实体,但 LRU 缓存返回的是附加到前一个db_session
.
当我在 之后清除缓存func1
时,错误消失了:
def main():
func1()
cached_func.cache_clear() # <- Clear Cache
func2()
经验教训:运行多个单独的 db_session 时要注意缓存。他们可以引入隐藏对象混合。
推荐阅读
- javascript - 尝试使用 node.js 将文件中的数据插入 mongodb。数据插入但本地主机页面未加载显示我的结束消息?
- php - 从第二级数组获取 ID 值
- python - 使用 PIL 与 opencv 的图像失真
- .htaccess - X-Robots-Tag - Noindex .htaccess 中的几个文件
- haskell - 如何在 GHCi 中打印类型的构造函数?
- bluefish - 如何在 Bluefish 编辑器中更改默认文档设置
- javascript - Puppeteer 如何从同一个班级调用第二个 div
- reactjs - 升级到 Webpack 5 打破 Storybook 5
- javascript - 重新格式化来自数组 javascript/React 的日期
- java - localTimeDate 公式转换