我偶然发现了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)上.
也许有一些使用注释的特殊规则?