我在使用Oracle数据库时遇到了锁定行的问题。锁的目的是为了防止多个事务从数据库中读取数据,因为这些数据会影响新数据的生成,并且在事务期间会发生更改。
为了实现锁定,我在SpringData查找方法上放置了@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)上没有出现。
也许有一些使用注释的特殊规则?