首页 > 解决方案 > LockModeType.PESSIMISTIC_WRITE 是否锁定结果行或整个表?

问题描述

搜索了一段时间后我放弃了,因为我在任何地方都找不到这个答案,所以我在这里尝试。

我正在使用 Spring Boot 和 CrudRepository 从我的 oracle 数据库中获取实体。但是,我不确定在 a 中调用的这段代码是否@Transaction会锁定我的整个表,或者只是锁定返回的结果实体findAllByStatusAndCreatedBetween

@Repository
public interface MyRepository extends CrudRepository<MyEntity, Long> {
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    List<MyEntity> findAllByStatusAndCreatedBetween(Status status, Date from, Date to);
}

标签: javaoraclespring-bootjpa

解决方案


LockModeType.PESSIMISTIC_WRITE 在内部执行 select for update 语句。

SELECT FOR UPDATE 锁定行和任何关联的索引条目,就像您为这些行发出 UPDATE 语句一样。其他事务被阻止更新这些行、执行 SELECT ... LOCK IN SHARE MODE 或读取某些事务隔离级别的数据。一致读取忽略读取视图中存在的记录上设置的任何锁定。(旧版本的记录不能被锁定;它们是通过在记录的内存副本上应用撤消日志来重建的。)

请检查https://docs.oracle.com/cd/E17952_01/mysql-5.1-en/innodb-locking-reads.html


推荐阅读