google-app-engine - Google 应用引擎 : which solves the race condition? 事务或比较并设置?

标签 google-app-engine concurrency race-condition

在带有 Python 的 Google App Engine 上,我正在寻找竞争条件问题的解决方案,即多个用户试图同时增加某个计数器。我找到了其中两个:transactions中描述的increment_counter()以及compare-and-set中的bump_counter() 。 我的问题:1)它们都完全解决了竞争条件问题吗? 2)如果是的话,哪一个更好?

此外,有人可以详细说明它们中的每一个,因为我看不出代码如何解决问题。例如,1)在increment_counter()事务期间,如果另一个用户更新计数器,事务会失败? 2)同样,在compare-and-set中的bump_counter()期间,如果另一个用户更新计数器,client.cas()会失败?

最佳答案

  1. 是的,它们都可以消除竞争条件。

  2. 第一个是使用数据存储,第二个是内存缓存。所以他们不能相提并论。 Memcache 是 volatile 的,可以随时清除 - 您不应该使用它来存储永久数据。所以在这方面数据存储事务是比较好的。此外,事务可以确保一组实体的原子性,而 Compare_and_set 仅确保一个内存缓存值的原子性。

  3. 事务不会阻塞。如果它们检测到碰撞,它们就会失败,您需要将其回滚并自己重复。

  4. memcache 也是如此:您需要自己重复该过程。

关于google-app-engine - Google 应用引擎 : which solves the race condition? 事务或比较并设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868786/

相关文章:

java - 如何在 GAEJ 中建模实体关系?

python - 如何使用 Google 在 Appengine 上的默认身份验证来跟踪 session ( session 持续时间、用户从何处登录等)?

google-app-engine - 从 Golang AppEngine 快速轻松地发布到 Slack Webhook

concurrency - 为并发编程语言选择一致性模型

c++ - 线程结束后同步

unit-testing - 表驱动测试中的竞争检测

java - HTTP 向 Google App Engine 发送动态数据和从 Google App Engine 发送动态数据

ios - 为什么在单独的线程中使用异步 HTTP 请求而不是同步 HTTP?

python - 为什么在所有 futures 完成后与 futures.as_completed 一起使用时,concurrent.futures 执行器映射会抛出错误?

go - Go 的竞争检测器如何感知锁定?