小编Ole*_*nko的帖子

如何使Hibernate @Lock注释适用于Oracle DB?

我偶然发现了Oracle DB中锁定行的问题.锁定的目的是防止多个事务从数据库读取数据,因为这些数据会影响新数据的生成并且在事务方面会发生变化.

为了进行锁定,我将@Lock注释放在SpringData查找方法上,该方法检索参与事务的数据.

@Lock(LockModeType.PESSIMISTIC_WRITE)
User findUserById(@Param("id") String operatorId);
Run Code Online (Sandbox Code Playgroud)

实现此代码后,我收到日志消息

org.hibernate.loader.Loader - HHH000444: Encountered request for locking however dialect reports that database prefers locking be done in a separate select (follow-on locking); results will be locked after initial query executes
Run Code Online (Sandbox Code Playgroud)

此外,它没有任何影响和原因

org.springframework.dao.DataIntegrityViolationException: could not execute batch; SQL [insert into ...]
Run Code Online (Sandbox Code Playgroud)

使用实体管理器重写锁时可以解决该问题

entityManager.lock(userByIdWithLockOnReadWrite, LockModeType.PESSIMISTIC_WRITE);    
Run Code Online (Sandbox Code Playgroud)

要么

entityManager.unwrap(Session.class).lock(userByIdWithLockOnReadWrite, LockMode.PESSIMISTIC_WRITE);
Run Code Online (Sandbox Code Playgroud)

该问题不会出现在MariaDB(MySQL)上.

也许有一些使用注释的特殊规则?

java oracle spring hibernate spring-data

4
推荐指数
1
解决办法
3155
查看次数

标签 统计

hibernate ×1

java ×1

oracle ×1

spring ×1

spring-data ×1