【问题标题】:How to avoid concurrent data modifications in GAE Datastore如何避免 GAE 数据存储中的并发数据修改
【发布时间】: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 数据存储避免脏读以确保数据正确性(或)避免并发修改?

【问题讨论】:

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


【解决方案1】:

交易:

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

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

【讨论】:

  • 我明白,但在少数情况下,我们不能只是让另一个事务失败,那么有没有办法避免第二个事务在提交之前进行脏读?
【解决方案2】:

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

  1. 实现您自己的事务失败逻辑(重试多少次等)

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

【讨论】:

  • 你能提供更多关于任务的信息吗?如何在我的场景中使用它们?另外我会假设一个任务将执行一项事务,这样我们可以同时运行多少个任务?
  • 我用更多细节更新了我的答案。此外,您可以配置任务执行率 - 您可以根据需要每秒执行多少次。
  • 感谢安德烈·沃尔金。感谢您的建议。
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多