Spring Data JPA如何无需编写SQL实现SELECT FOR UPDATE查询
解决方案
你可以直接给目标方法添加@Lock(LockMode.PESSIMISTIC_WRITE)注解,无需编写@Query语句,Spring Data JPA会自动为这个派生查询方法生成带SELECT FOR UPDATE的SQL:
@Lock(LockMode.PESSIMISTIC_WRITE) Optional<MyStuff> findByFooAndBarForUpdate(Foo foo, Bar bar);
原理说明
Spring Data JPA的查询派生机制会根据方法名里的ByFooAndBar部分自动解析生成对应的WHERE条件;而@Lock(LockMode.PESSIMISTIC_WRITE)注解会告诉JPA在执行查询时添加悲观写锁,最终生成的SQL会包含FOR UPDATE子句(不同数据库的语法可能略有差异,但Spring Data JPA会自动适配)。
额外注意
- 确保你的数据库支持悲观锁(MySQL、PostgreSQL等主流数据库均支持);
- 如果需要其他锁类型,可以替换
LockMode枚举值,比如PESSIMISTIC_READ对应共享锁; - 方法名里的
ForUpdate只是语义化命名,Spring Data JPA不会解析这部分,你也可以改用findByFooAndBarWithLock这类命名,只要核心查询条件部分(ByFooAndBar)符合派生规则即可。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

