库 - Spring-Data-JPA,Java 8,JUnit-4(用于测试)
我有一个实体,我们称之为Semaphore
。有多台机器试图创建一行Semaphore
。我们只希望其中一个成功。这是发生的事情 -
Semaphore
行有一个主键,始终为1。save
exists
,但这并不保证任何内容,因为两台机器都可以在其中任何一台创建记录之前进行检查。我们有什么选择,除了直接使用实体管理器查看实体是否是新的?基本上覆盖Spring Data保存方法。
我们使用Oracle作为数据库。
对于每个人的现成参考,这里是Spring的SimpleJpaRepository
保存方法。
@Transactional
public <S extends T> S save(S entity) {
if(this.entityInformation.isNew(entity)) {
this.em.persist(entity);
return entity;
} else {
return this.em.merge(entity);
}
}
答案 0 :(得分:1)
您需要的是乐观锁定,您可以使用@Version
类中使用@Entity
注释的版本字段来完成此操作。
E.g。
@Version
private Long version;
答案 1 :(得分:0)
以下是我们解决此问题的方法。
save
。@Version
字段上的Long version
标记进行乐观锁定版本。 findById
查找记录。如果找到一个我们去更新它。如果更新失败,我们知道这台机器失去了它的出价,所以它放弃了。persist
进行插入。如果坚持不通,我们就知道这台机器失去了它的出价,所以它放弃了。@Transactional
注释中。 感谢大家的帮助!