我正在使用任务队列来更新 GAE 中的某些数据。
我的queue.xml 文件如下所示
<queue>
<name>data-processing</name>
<rate>20/s</rate>
</queue>
我的队列处理 servlet 将每个任务的信用值减少 1。 在处理时需要检查信用可用性和 仅当信用可用时才继续进行。
积分存储在表中,并在任务完成时更新。
我将任务视为线程并担心同步问题。
如果 2 个或更多任务同时查询/更新信用表怎么办?我需要创建一些锁定机制吗? 如果是的话怎么办?
最佳答案
是的,您确实需要同步。您通常会以读取-修改-写入方案更新积分:首先读取可用积分,减去一,然后写回剩余的积分。如果两个任务同时执行此操作,一个任务可能会覆盖另一个任务的结果,从而导致存储的信用计数不正确。 (除非有一个原子指令,它确实存在于 Memcache,但我认为不存在于数据存储)。
您可以使用事务来解决此问题,请参阅http://code.google.com/appengine/docs/java/datastore/transactions.html
关于java - bigtable需要锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3083591/