我的应用程序当前面临一个问题,竞争条件有时会导致多个线程将相同的值写入数据存储区。
伪代码如下所示:
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/