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

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

理论场景:我有一个电子商务网站,在 GAE 数据存储中保存库存。每条记录都包含项目名称和计数。该店客流量很少,库存量大,因此不太可能有多个顾客同时购买同一商品;这样做是为了让我们不必关注在持续一段时间内每秒多次更新同一记录的数据存储限制。

万一两个客户同时购买同一商品,如何正确更新商品记录?保持每件元素的正确数量至关重要。

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

谢谢

最佳答案

Cloud Datastore 事务使用开放式并发,因此您可以同时尝试 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每个项目的计数器。

关于database - GAE数据存储同时更新记录的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40003295/

相关文章:

java - 死你threadpoolexecutor

java - 如果线程不更改映射结构,我应该使用 ConcurrentHashMap 还是 HashMap?

database - Oracle 11g 损坏的物化 View : Stop refresh without dropping view or refreshing view?

security - Google Cloud Function 通过内部 IP 连接到 Google Compute Engine

ruby-on-rails - windows环境无法识别postgres 'psql'命令

python - 在 Google App Engine 中使用 @ndb.tasklet 或 @ndb.synctasklet

google-app-engine - 数据存储读/写操作

sql - 我应该使用哪种锁定提示 (T-SQL)?

PHP 使用数据库中的 TIME 来计算小时数

mysql - 错误代码 : 1136. 在将在 3 个表中添加数据的过程中,列计数与第 1 行的值计数不匹配?