2010-06-21 76 views
2

我在GAE中使用任务队列进行某些数据更新。bigtable是否需要锁定?

我queue.xml中文件看起来像下面

<queue> 
    <name>data-processing</name> 
    <rate>20/s</rate> 
    </queue> 

我的队列处理的servlet减少信贷由1每个任务。 在处理时,需要检查信用可用性,并且只有在信用可用时才能继续进行 。

信用存储在表中,并在任务完成时得到更新。

我将任务视为线程并担心同步问题。

如果2个或更多任务同时查询/更新信用表,该怎么办?我是否需要创建一些锁定机制? 如果是的话那么怎么样?

回答

5

是的,你需要同步。您通常会以读 - 修改 - 写方案更新学分:首先读取可用学分,减去一个,然后将剩余学分写回。如果两个任务同时执行此操作,则可能会覆盖另一个任务的结果,导致存储的信用计数不正确。 (除非有这样的原子指令,这对Memcache来说确实存在,但对于我认为的Data Store不存在)。

您可以使用事务来解决这个问题,看http://code.google.com/appengine/docs/java/datastore/transactions.html

0

App Engine的任务队列中取出占执行率本身的照顾。除了配置queue.xml之外,您不需要执行其他任何操作。