Spring Data JPA仅写方法需@Transactional?自定义方法事务疑问
问题解答
为什么查询方法无需@Transactional也能正常运行?
- Spring Data JPA 对只读查询类方法做了特殊适配:即使没有显式添加
@Transactional,底层会自动利用JDBC的自动提交模式,或隐式开启一个只读事务来执行查询。 - 查询操作本身不涉及数据变更,不需要事务的提交/回滚保障,仅需获取数据库连接执行SQL即可,框架会自动处理这部分上下文,所以不用注解也能正常返回结果。
为什么@Modifying的删除方法必须加@Transactional?
@Modifying注解标记的是数据变更操作(增、删、改),这类操作需要事务来保证数据的原子性和一致性,Spring Data JPA不会为自定义的@Modifying方法自动注入事务逻辑。- 对比CrudRepository的默认方法(比如自带的
deleteById):这些方法是框架预先实现的,已经被自动加上了@Transactional注解;但你自定义的带@Modifying的查询方法属于自定义逻辑,必须显式声明事务才能触发执行,否则框架会抛出TransactionRequiredException,提示缺少事务上下文。 - 另外,
@Modifying方法需要EntityManager执行flush操作来同步数据变更,而flush操作必须在事务中进行,这也是必须加注解的原因之一。
内容的提问来源于stack exchange,提问作者Kumarasamy
相关产品推荐
相关产品推荐

