[英]Hibernate JPA/CrudRepository Entity Locking in Spring Boot
我要开发的REST应用程序存在以下问题:在我的一个服务类中,我有一种从数据库中删除对象的方法,同时通知用户该资源是否不存在,类似于以下内容:
@Transactional
public class MyEntityService {
@Autowired
private MyEntityrepository repo
public void delete(String name) {
MyEntity e = repo.findByName(name)
.orElseThrow(() -> new ResourceNotFoundException(name));
repo.delete(e);
}
}
我有什么方便的方法可以确定对delete方法的调用是否与目标对象所在的实体重叠? 我考虑过使用EntityManagers锁定方法( https://www.objectdb.com/api/java/jpa/EntityManager/lock_Object_LockModeType ),如下所示:
MyEntity e = repo.findByName(name)
.orElseThrow(() -> new ResourceNotFoundException(name));
try {
em.lock(e, LockModeType.PESSIMISTIC_WRITE)
} catch ( PessimisticLockException e) {
//Handle somehow
}
repo.delete(e);
但是我不确定这是否是正确的方法,或者我应该尝试删除将其删除级联到锁定实体的父实体时会发生什么情况。
有两种方法可以解决该问题: 悲观锁定和乐观锁定 。
我不会在应用程序级别使用悲观锁定,而是使用数据库隔离级别处理对多个事务的数据可见性。 我在这里假设您正在使用RDMS 。 阅读有关数据库的并发控制机制的信息,并根据您的应用程序需求选择适当的隔离级别。 PostgreSQL文档是一个很好的资源。
然后,您可以使用乐观锁定来解决丢失的更新问题。 我建议你阅读此有关的主题很好的资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.