谷歌应用引擎:它解决了竞争条件?交易还是比较和设定?

时间:2013-02-14 06:10:12

标签: 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 个答案:

答案 0 :(得分:3)

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

  2. 第一个是使用数据存储,第二个内存缓存。所以他们无法比较。 Memcache是​​易失性的,可以随时清除 - 您不应该使用它来存储永久数据。所以在这方面数据存储区事务更好。此外,事务可以确保一组实体的原子性,而compare_and_set仅在一个memcache值上确保原子性。

  3. 交易不会阻止。如果他们检测到碰撞,他们就会失败,你需要将其翻滚并重新自己重复。

  4. 同样关于memcache:您需要自己重复此过程。