【问题标题】:Inconsistent data in datastore on concurrent writes并发写入时数据存储中的数据不一致
【发布时间】:2016-04-22 13:33:11
【问题描述】:

我正在使用 Twitter 等社交网络应用程序,人们可以在其中互相关注。这是我的用户和友谊模型。

class User(ndb.Model):
    followers_count = ndb.IntegerProperty(default=0, indexed=True)
    following_count = ndb.IntegerProperty(default=0, indexed=False)
    created_time = ndb.DateTimeProperty(auto_now_add=True)

class Friendship(ndb.Model):
    user = ndb.KeyProperty(kind=User)
    follower = ndb.KeyProperty(kind=User)
    created_time = ndb.DateTimeProperty(auto_now_add=True)

我面临的问题是,当用户在入职期间同时关注 20 人时,用户计数是错误的。应该是 20 的时候是 5 或 6 或 7。

以下是以下代码,

user = user_key.get()
follower = follower_key.get()

def incr_counts_in_user():
    user.followers_count += 1
    follower.following_count += 1

@ndb.transactional(retries=10, xg=True)
def run():
    friendship = create_friendship()
    incr_counts_in_user()
    ndb.put_multi([user, follower, friendship])
run()

【问题讨论】:

  • 你还没说 create_friendship 是做什么的?任何非祖先查询都会受到最终一致性问题的影响。您应该考虑使用队列来处理好友创建和可能的前滚语义。而这篇文章blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine 使用 db。可以使用相同的方法而不是 ndb。

标签: google-app-engine app-engine-ndb google-cloud-datastore google-app-engine-python


【解决方案1】:

在我看来,您并没有在交易中获取用户。您用于事务修改的任何数据也需要在事务内部读取,否则它实际上不是事务。

【讨论】:

  • 是的,这正是问题所在。修好了。
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2021-01-22
  • 2019-08-19
相关资源
最近更新 更多