由于没有Datastore-memcache事务,ndb需要执行多个memcache集并获取以避免潜在的竞争条件。为了正确执行此操作,ndb需要锁定memcache并确保只有一个ndb tasklet实际更新memcache条目。
当你执行一个 get() 对于不在memcache中的实体,会发生以下情况:
get()
额外的 Set (步骤2)是从数据存储区获取实体时锁定与实体关联的memcache条目。
Set
额外的 Get (步骤3)是获取比较和交换令牌。这确保了如果在步骤2和5之间更新了memcache条目,则tasklet将不会覆盖memcache条目。
Get
如果你有兴趣,我建议看看 执行此操作的代码 。