【发布时间】:2014-06-04 10:17:02
【问题描述】:
假设下面是GAE数据存储类型,需要将两个不同的玩家信息存储到一个实体中,如何保持数据的正确性?
@Entity
public class Game
{
id
player1Id
player2Id
score1
score2
}
假设 player1 想要修改 score1,他首先读取实体并修改 score1 并保存回数据存储区。
同样player2想要修改score2,他也先读取实体,修改score2并保存回datastore。
因此,有了这个功能,player1 和 player2 就有可能尝试修改同一个实体,并且由于脏读,他们最终可能会错误地修改数据。
有没有办法通过 GAE 数据存储避免脏读以确保数据正确性(或)避免并发修改?
【问题讨论】:
-
正如其他答案所说,您需要使用事务。还要考虑一个前滚事务模型。阅读 Nick Johnson 关于该主题的这篇文章,示例是 python,但它同样适用于 java blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine
标签: google-app-engine google-cloud-datastore objectify