2

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

另外,是否有人可以详细说明它们中的每一个,因为我看不到代码如何解决问题。例如,1)在increment_counter()事务期间,如果另一个用户更新了计数器,事务会失败吗?2)同样,在比较和设置的bump_counter()期间,如果另一个用户更新计数器,client.cas()会失败吗?

4

1 回答 1

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

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

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

  4. memcache 同上:您需要自己重复该过程。

于 2013-02-14T06:54:15.910 回答