我使用gcloud-java-datastore API(v0.2.3)来使用Google Cloud Datastore。尝试使用事务来阻止对根实体的同步更新我似乎无法让事务以我认为应该的方式工作。也许我的理解不对,但绝对可以使用一些帮助。
下面是一个测试用例,其中两个线程在自己的事务中加载相同的实体,更新实体并提交。我希望一个线程的提交成功而另一个线程失败。但是,每次,两个线程都成功地覆盖了第一个线程的变化。这是预期的吗?根据{{3}}的官方文档,我解释说只有一个交易会成功。
@Test
public void test2() {
Datastore datastore = DatastoreOptions.defaultInstance().service();
KeyFactory keyFactory = datastore.newKeyFactory();
com.google.cloud.datastore.Key key = keyFactory.kind("Account").newKey(5642398931615744L);
Runnable r = new Runnable() {
@Override
public void run() {
Transaction transaction = datastore.newTransaction();
try {
Entity entity = transaction.get(key);
System.out.println(entity);
Entity modifiedEntity = Entity.builder(entity).set("name", Thread.currentThread().getName())
.build();
transaction.put(modifiedEntity);
transaction.commit();
System.out.println(String.format("%1s: Commit successful", Thread.currentThread().getName()));
} catch (Exception exp) {
exp.printStackTrace();
} finally {
if (transaction.active()) {
transaction.rollback();
}
}
}
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException exp) {
exp.printStackTrace();
}
}
当我运行此测试用例时,我在控制台上看到以下输出:
Thread-2: Commit successful
Thread-1: Commit successful
感谢。