【发布时间】:2018-04-02 04:47:24
【问题描述】:
我正在使用带有 Spring Data JPA 的 Hibernate 5.2.15。
假设我需要实现投票系统 - 所以用户只需点击“投票”按钮,数据库中的“投票”列现在是 +1。
我已经实现了下一个方法:
public interface CrudRestRepository extends Repository<Restaurant,Integer> {
@Modifying
@Transactional
@Query("UPDATE Restaurant r SET r.votes=r.votes+1 where r.id=:restId ")
@Lock(LockModeType.PESSIMISTIC_WRITE)
void addVoteToRestaurant(@Param("restId")int restId);
}
但是当我尝试使用这种方法时,我得到了下一个异常:
IllegalStateException:非法尝试在非 SELECT 查询上设置锁定模式
所以,我用谷歌搜索了它,似乎不允许对非选择查询设置锁定 - https://docs.oracle.com/javaee/6/api/javax/persistence/Query.html#setLockMode(javax.persistence.LockModeType)
我的问题是:
1) 为什么会这样?我是数据库的新手,但我认为尽管查询类型我可以使用锁定。
2) 如果我需要为一列的大量更新提供并发性,比如百万用户,我该怎么办?从使用Hibernate的角度来看。
非常感谢!
【问题讨论】:
标签: java database hibernate jpa spring-data-jpa