GAE数据存储区同时更新记录的字段

时间:2016-10-12 16:07:30

标签: database google-app-engine concurrency google-cloud-datastore

理论场景:我有一个ecomerce网站,在GAE数据存储区中保留一个库存。每条记录都包含项目名称和计数。该商店的流量非常小,库存量很大,因此多个客户不太可能同时购买同一商品;这是在这里,所以我们不关注数据存储限制在持续的一段时间内每秒多次更新相同的记录。

如果两个客户同时购买同一商品,我该如何正确更新商品的记录?至关重要的是,我们要为每个项目保持正确的数量。

在mongo世界中,我会使用类似$ inc操作的东西。您如何解决GAE数据存储的这种情况?

由于

1 个答案:

答案 0 :(得分:2)

云数据存储区事务使用乐观并发,因此您可以同时尝试2个事务。如果实体发生变化,则会失败 - 此时您只需重试失败的交易。

例如,在Python NDB中,您可以在事务装饰器中进行特定次数的重试尝试。

示例代码:

from google.appengine.ext import ndb

...

@ndb.transactional(retries=5)
def inc_item_count(item_key, count_purchased):
       item = item_key.get()
       item.count_purchased += count_purchased
       item.put()

       return True

网络规模?

如果您扩展到此解决方案的工作范围之外,您将要探索基于任务计划的系统,或者转向sharding counters每个项目的计数器。