【发布时间】:2017-02-28 03:15:14
【问题描述】:
我偶然发现了在 Oracle DB 中锁定行的问题。锁的目的是防止多个事务从 DB 中读取数据,因为这些数据会影响新数据的生成,并且在事务方面会发生变化。
为了生成锁,我在 SpringData 的 find 方法上添加了 @Lock 注释,该方法检索参与事务的数据。
@Lock(LockModeType.PESSIMISTIC_WRITE)
User findUserById(@Param("id") String operatorId);
执行此代码后,我会收到日志消息
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
此外,它没有影响和原因
org.springframework.dao.DataIntegrityViolationException: could not execute batch; SQL [insert into ...]
使用实体管理器重写锁时可以解决问题
entityManager.lock(userByIdWithLockOnReadWrite, LockModeType.PESSIMISTIC_WRITE);
或
entityManager.unwrap(Session.class).lock(userByIdWithLockOnReadWrite, LockMode.PESSIMISTIC_WRITE);
MariaDB (MySQL) 上未出现此问题。
也许使用注解有一些特殊的规则?
【问题讨论】:
标签: java spring oracle hibernate spring-data