让我们说下面是GAE数据存储类型,需要将两个不同的玩家信息存储到一个实体中,如何保持数据的正确性?
@Entity
public class Game
{
id
player1Id
player2Id
score1
score2
}
假设player1想要修改score1,他首先读取实体并修改score1并保存回数据存储区。
同样,player2想要修改score2,他首先读取实体并修改score2并保存回数据存储区。
因此,有了这个功能,player1和player2都有可能尝试修改同一个实体,并且由于脏读而最终可能会错误地修改数据。
有没有办法避免使用GAE数据存储进行脏读操作以确保数据正确性(或)避免并发修改?
答案 0 :(得分:3)
交易:
https://developers.google.com/appengine/docs/java/datastore/transactions
当两个或多个交易同时尝试修改时 一个或多个公共实体组中的实体,仅第一个 事务提交其更改可以成功;所有其他人都会 提交失败。
答案 1 :(得分:2)
您需要使用Transactions,然后您有两个选择:
为事务失败实现自己的逻辑(重试次数等)
不是直接写入数据存储区,而是创建task来修改实体。在任务中运行事务。如果失败,App Engine将重试此任务,直到成功为止。