小心 Spring 的事务可能没有生效
- 生效原则1:除非特殊配置(比如使用 AspectJ 静态织入实现 AOP),否则只有定义在 public 方法上的 @Transactional 才能生效。
- 原因是,Spring 默认通过动态代理的方式实现 AOP,对目标方法进行增强,private 方法无法代理到,Spring 自然也无法动态增强事务处理逻辑。
- 生效原则 2,必须通过代理过的类从外部调用目标方法才能生效。
事务即便生效也不一定能回滚
- 通过 AOP 实现事务处理可以理解为,使用 try…catch…来包裹标记了 @Transactional 注解的方法,当方法出现了异常并且满足一定条件的时候,在 catch 里面我们可以设置事务回滚,没有异常则直接提交事务。主要有两点
- 只有异常传播出了标记了 @Transactional 注解的方法,事务才能回滚。
- 默认情况下,出现 RuntimeException(非受检异常)或 Error 的时候,Spring 才会回滚事务。
请确认事务传播配置是否符合自己的业务逻辑
总结和思考
SpringData JPA是spring基于ORM框架、JPA规范的基础上封装的一JPA应用框架,可以使开发者使用极简的代码实现对数据库的访问和操作。它提供了包括增删改查等在内的基本功能,且易于扩展。
我们使用java代码调用springdata jpa的api,springdata jpa封装了jpa规范,并且内部使用的是hibernate实现,hibernate封装了jdbc进行数据库操作。