如何避免GAE数据存储区中的并发数据修改

时间:2014-06-04 10:17:02

标签: google-app-engine google-cloud-datastore objectify

让我们说下面是GAE数据存储类型,需要将两个不同的玩家信息存储到一个实体中,如何保持数据的正确性?

@Entity
public class Game
{
    id
    player1Id
    player2Id
    score1
    score2
}

假设player1想要修改score1,他首先读取实体并修改score1并保存回数据存储区。

同样,player2想要修改score2,他首先读取实体并修改score2并保存回数据存储区。

因此,有了这个功能,player1和player2都有可能尝试修改同一个实体,并且由于脏读而最终可能会错误地修改数据。

有没有办法避免使用GAE数据存储进行脏读操作以确保数据正确性(或)避免并发修改?

2 个答案:

答案 0 :(得分:3)

交易:

https://developers.google.com/appengine/docs/java/datastore/transactions

  

当两个或多个交易同时尝试修改时   一个或多个公共实体组中的实体,仅第一个   事务提交其更改可以成功;所有其他人都会   提交失败。

答案 1 :(得分:2)

您需要使用Transactions,然后您有两个选择:

  1. 为事务失败实现自己的逻辑(重试次数等)

  2. 不是直接写入数据存储区,而是创建task来修改实体。在任务中运行事务。如果失败,App Engine将重试此任务,直到成功为止。