java - 查询 Google App Engine 数据存储区时出现并发问题

标签 java multithreading google-app-engine concurrency

我的应用程序当前面临一个问题,竞争条件有时会导致多个线程将相同的值写入数据存储区。

伪代码如下所示:

public void writeToDatastore(ValueObject obj){
   boolean objectExists = checkDatastoreForObject(obj);

   if(!objectExists){
      doSomeStuff();
      writeObjectToDatastore(obj);
   }
}

有时,在写入任何内容之前,两个或多个线程会从数据存储中读取数据,这会导致对象的多个实例被持久化。

添加 synchronized 关键字(或其他并发结构)可以解决该问题 - 前提是应用程序只有一个实例在运行。

如何在分布式环境中解决这些类型的并发问题?

最佳答案

从 App Engine 调用数据存储区时,请使用事务。首先尝试 get() 实体以查看它是否存在。如果没有,则 put() 实体。

以下是一些示例代码,演示了使用 App Engine API 进行事务处理:https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/datastore/src/test/java/com/example/appengine/TransactionsTest.java

关于java - 查询 Google App Engine 数据存储区时出现并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41451682/

相关文章:

python - 从 NDB 中的 ComputedProperty 函数返回列表的解决方法

ios - 从另一个线程调用的 CoreData ContextObjectsDidChangeNotification

python - 为什么类中需要 Thread.__init__() ?

multithreading - 如何在不同线程上运行函数?

google-app-engine - 是否可以将两个字段设置为ndb中实体的索引?

java - Android - 按钮 : Receiving through data through intents/other methods

java - JOOQ 如果满足条件则插入

java - 通过外部安排的 SSO 实现接缝安全

java - 如何使用一个公共(public)属性对对象的数组列表进行排序

python - Google App Engine Python 的 RSA 加密例程