我有一个 JPA 实体类用户,其用户名 @ID 且没有父实体组。我需要确保当两个并行事务尝试使用相同的用户名持久化一个新用户时,只有一个被提交,另一个被回滚。
例子:
User bob = new User("bob");
EntityTransaction transaction = em.getTransaction();
try {
transaction.begin();
User u = em.find(User.class, bob.id());
if (u == null) {
em.persist(bob);
} else {
// identical user already existed before the transaction
throw new UserExistsException();
}
transaction.commit();
} catch (RollbackException e) {
// identical user was created during the transaction
throw new UserExistsException();
}
根据 Datastore 文档,事务遵循乐观锁定方法:
“当事务开始时,App Engine 通过检查事务中使用的实体组的最后更新时间来使用乐观并发控制。在为实体组提交事务时,App Engine 再次检查在事务中使用的实体组的最后更新时间“ (https://developers.google.com/appengine/docs/java/datastore/transactions)
这在持久化事务之前不存在的新(根)实体时是否有效?就我而言,App Engine 是否会检查另一笔交易是否同时保留了具有相同 ID 的用户?如果是这样,我是否需要一个显式的 @Version 字段来达到这个目的?