如何在GAE数据存储中保存实体,只有在防止竞争条件时不存在该实体

我正在尝试将实体保存到Google App Engine数据存储区,如果它不存在,如果它确实不应该继续。

主要问题是:我想要防止任何竞争条件,这样如果两个线程同时执行此操作,则只有一个线程可以成功保存实体。

我不确定什么是最好的方法,使用事务工作或者必须依赖其他解决方案,例如使用Memcache

请在java中提供低级API的答案

假设两个线程都试图用相同的密钥保存实体,那么这段代码:

datastore.add(entity); 

会做你想做的。 如果实体已存在于具有相同密钥的数据存储区中,则.add()将引发exception。

从App Engine调用数据存储时,api是不同的。 使用交易。 首先尝试获取()实体以查看它是否在那里。 如果没有,请put()实体。

以下是使用App Engine API演示事务的示例代码: https : //github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/datastore/src/test/java/com/example/appengine/TransactionsTest的.java