Google app engine 为什么GoogleDataStore第二次查询返回修改后的实例(在第一次查询后不调用put)?

Google app engine 为什么GoogleDataStore第二次查询返回修改后的实例(在第一次查询后不调用put)?,google-app-engine,app-engine-ndb,google-cloud-datastore,Google App Engine,App Engine Ndb,Google Cloud Datastore,我在查询数据存储时遇到了一个非常违反直觉的情况 以下是步骤: 使用第一个查询检索对象:list\u objects=MyModel.query(cls.name==name.fetch() 修改列表对象:中o的列表对象:o.value=new\u值 第二次检索对象:list\u objects\u 2=MyModel.query(cls.name==name.fetch() 现在,list_objects_2中的所有对象都有了新的_值,尽管在步骤2中,从未调用put来实际修改数据存储,我检查了中

我在查询数据存储时遇到了一个非常违反直觉的情况

以下是步骤:

  • 使用第一个查询检索对象:
    list\u objects=MyModel.query(cls.name==name.fetch()

  • 修改列表对象:
    中o的列表对象:o.value=new\u值

  • 第二次检索对象:
    list\u objects\u 2=MyModel.query(cls.name==name.fetch()

  • 现在,list_objects_2中的所有对象都有了新的_值,尽管在步骤2中,从未调用put来实际修改数据存储,我检查了中间的数据存储,该值是原始值

  • 在列表对象中修改o的列表对象2:
    :o.value=new\u new\u value
    ,现在列表对象1都具有new\u new\u值

  • 我还尝试了
    fetch(keys_only=True)
    k.get()
    ,但问题相同

    我的印象是,查询是针对实际数据存储的,为什么它总是返回相同的实例,而不是构建新的实例?这是由于某种缓存造成的吗?

    请查看本文

    上下文缓存速度快;这个缓存存在内存中。当NDB 函数写入数据存储,同时也写入上下文中的 隐藏物当NDB函数读取实体时,它会在上下文中检查实体 先缓存。如果在那里找到实体,则不存在数据存储交互 发生了

    当NDB函数查询数据存储时,结果列表为 从数据存储中检索。但是,如果有任何单独的结果 在上下文缓存中,它用于替换从中检索的值 数据存储查询。查询结果将写回上下文中 如果缓存策略这么说,则缓存(但决不向Memcache)

    1)
    list\u objects=MyModel.query(cls.name==name.fetch()

    在上下文缓存中预热

    2)
    对于列表中的o对象:o.value=新值

    仅修改内存中的对象

    3)
    list\u objects\u 2=MyModel.query(cls.name==name.fetch()

    实际上,没有数据存储交互发生,您从缓存中获取相同的对象

    4)
    对于列表对象中的o:o.value=new\u new\u value

    仅修改内存中的对象


    5)
    fetch(keys\u only=True)
    k.get()
    没有发生数据存储交互

    听起来不对,你能给出一个可重复的例子吗?谢谢!事实就是这样。我在反复试验后发现了这一点,它与进程内缓存有关,如果我添加fetch(use_cache=False),那么查询将返回新实例,尽管我有点惊讶为什么进程内缓存在默认情况下是打开的。