【发布时间】:2021-07-10 10:43:20
【问题描述】:
有没有一种简单的方法来强制连接 Isolation.REPEATABLE_READ 并为 select 语句写入锁定,所以一旦我读取了事务 T1 中的一行,所有其他尝试读取同一行的事务将挂起,直到 T1 是提交/回滚?
【问题讨论】:
标签: java spring hibernate locking isolation-level
有没有一种简单的方法来强制连接 Isolation.REPEATABLE_READ 并为 select 语句写入锁定,所以一旦我读取了事务 T1 中的一行,所有其他尝试读取同一行的事务将挂起,直到 T1 是提交/回滚?
【问题讨论】:
标签: java spring hibernate locking isolation-level
听起来你需要pessimistic locking 使用 PESIMISTIC_WRITE 策略
【讨论】:
在您的服务方法或您希望此注解的任何位置使用您想要的具有可重复读取的隔离级别的事务
@Transactional(isolation = Isolation.REPEATABLE_READ)
记得从org.springframework.transaction.annotation;导入那个注解
而不是来自javax.*
如果您还想锁定并发读取,请转到将实体带给您的 JPA 方法,如果您使用默认值之一,则在您的存储库中再次定义它,并使用以下注释
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<MyEntity> findByName(String name);
@Lock 必须在事务内部调用,否则会引发异常。所以之前的@Transactional 是强制的
点击这里了解更多信息Lock Modes in JPA
【讨论】: