2012-05-27 145 views
0

我试图解决一个错误。以下函数将一个Key对象添加到名为tabs的用户属性中。由于某种原因,在用户实体上调用put()后,新保存的密钥不会被保存。无法弄清楚为什么。也许有一些延迟可以防止更改立即出现?在这种情况下,memcache的解决方案?数据存储不会将新更改保存到实体中

class User(GeoModel): 
    tabs = db.ListProperty(db.Key) 

@db.transactional 
def add_tab_transaction(self, user_key, tab_key): 
    user = models.User.get(user_key) 
    user.tabs.append(tab_key) 
    user.put() 
    logging.debug('tabs this user has:') 
    logging.debug(user.tabs) # prints the list with the new value 
    user = models.User.get(user_key) 
    logging.debug('rechecking the same thing:') 
    logging.debug(user.tabs) # prints the list without the new value 
+0

你是否看到这种情况发生在本地或服务器上?如果服务器是HRD? –

+0

在服务器上,是的,它是高复制 – Uri

+0

在这种情况下,有可能put()在您调用get()时不会完成写入所有副本,在这种情况下,您的get()将回归旧的价值观。你可以测试这个,稍后再运行另一个。一点点,我的意思是稍后一秒钟。如果你这样做,你还在返回旧数据吗? –

回答

0

此行为在Isolation and Consistency中进行了说明。

“在一个事务中,所有的读操作都反映了数据存储在事务开始时的当前一致状态,这不包括事务内部的先前的放入和删除。

+0

这解释了函数内部的日志记录,但它并不能解释为什么我在数据存储区查看器中看到旧数据,运行此函数后很长一段时间(分钟)。 – Uri

+0

由于我现在不能复制这个问题,所以我会将其标记为答案。 – Uri

+0

@Uri数据存储查看器使用与其他所有API相同的API。尽管如此,单击该行将使其执行强烈一致的读取并显示最新数据。 –

相关问题