You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用PESSIMISTIC_WRITE时需配置Propagation.MANDATORY?

你的理解完全正确
  • JPA的悲观锁(比如@Lock(LockModeType.PESSIMISTIC_WRITE))必须依赖活跃的事务上下文才能生效。因为悲观锁是数据库级别的锁,需要事务来绑定锁的生命周期——如果没有事务,查询语句执行完毕后锁会立即被释放,相当于根本没执行锁定操作。
  • @Transactional(propagation = Propagation.MANDATORY)的核心作用就是强制约束调用场景:只有当当前已经存在一个事务时,这个方法才能被正常调用;如果没有事务,直接抛出异常。这就从调用入口堵住了“无事务调用带锁方法”的情况,避免开发者被方法名里的WriteLocked语义误导。
  • 如果不设置这个传播属性,当开发者在无事务环境下调用findWriteLockedById时,代码不会报错,但锁完全不生效。这种“看起来加了锁实际没加”的情况,会在并发修改场景下引发数据不一致问题,比如多个线程同时修改同一条Employee记录,因为没有锁的保护出现脏写、数据覆盖等bug。

补充说明

你提供的Repository代码是合理的实践:

interface EmployeRepository extends JpaRepository<Employe, String> {

    @Transactional(propagation = Propagation.MANDATORY)
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    Optional<Employe> findWriteLockedById(String id);
}

通过MANDATORY传播机制,确保这个带锁查询方法只能在事务内被调用,保证锁的语义和实际行为一致。

内容的提问来源于stack exchange,提问作者vi0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:17:05