品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
很多做Java开发的程序员都踩过事务管理的坑,明明代码逻辑没问题,但是数据就是没有回滚,排查了半天才发现是事务没生效。很多人刚入行的时候对着一堆XML配置文件一脸懵,不知道Spring到底在背后帮我们做了什么,越用Spring,越会觉得它的事务机制设计十分智能,但也正是因为太自动了,以至于很多人用了好几年都说不清楚它的底层逻辑,遇到问题就只能靠猜。下面就给大家介绍一下Spring如何管理事务,Spring可以整合哪些框架的相关内容。
一、Spring如何管理事务
Spring管理事务的核心是PlatformTransactionManager接口,不管底层用JDBC、Hibernate还是JPA,都是通过这个接口来统一管理,它把具体实现交给对应子类,比如JDBC场景对应的是DataSourceTransactionManager。

事务管理有两个绕不开的概念,传播行为和隔离级别,传播行为控制多个事务方法互相调用时怎么处理,最常用的是REQUIRED,如果有事务就加入,没有就新建。隔离级别对应数据库的四个级别,Spring默认沿用数据库自身的设置,MySQL InnoDB默认是可重复读。
我们在实际开发里用得更多的是@Transactional注解,Spring通过AOP代理在方法前后自动处理事务的开启和提交,不需要我们再去手动干预了。

但使用时也有一些注意点,例如同类内部调用会导致注解失效,因为绕过了代理对象。此外就是默认只回滚RuntimeException,受检异常需要手动指定rollbackFor。另外,非public方法上加注解也不会生效。Spring的事务管理用起来门槛不高,这些细节如果不清楚,出了问题就很难排查问题的根源在哪里。
二、Spring可以整合哪些框架
Spring的整合能力是它能成为Java生态核心框架的原因之一,基本上我们在项目里能用到的主流框架,Spring都能无缝整合。
以持久层这块来说,MyBatis和Spring的整合在开发的时候非常常见。通过mybatis-spring依赖就能把SqlSessionFactory和Mapper接口交给Spring容器管理,事务也能直接用Spring那套。同样作为持久层框架,JPA和Hibernate跟MyBatis同理,Spring Data JPA在此基础上又封装了一层,连基础的CRUD方法都不用自己写了。

对于Web层框架,Spring MVC本来就是Spring家族自己的东西,所以是天然整合,如果项目想用响应式编程,Spring WebFlux也是现成的选择。

中间件这块覆盖得也很广,Redis可以通过spring-data-redis接入,消息队列无论是RabbitMQ还是Kafka,Spring都有对应的整合模块,配置成本并不高。如果要定时任务,可以整合Quartz,也可以直接用Spring自带的@Scheduled,简单场景够用了。安全框架就选Spring Security,例如权限控制、认证流程都能在Spring体系内完成,不需要引入额外的东西。

Spring不一定能把每件事做到极致,但能把各个领域最好用的框架串联起来,这也是它真正的价值所在。
以上就是Spring如何管理事务,Spring可以整合哪些框架的全部内容了。Spring的事务管理和框架整合能力,解决的都是同一个问题——让开发者把精力放在业务上,而不是反复处理那些重复的底层逻辑。当然,用起来方便并不意味着我们就可以不去理解它的原理。事务失效这类问题,往往就栽在对Spring框架的不理解上。框架整合也一样,能跑起来是第一步,搞清楚背后的协作机制才算真正掌握,所以,建议大家多翻翻源码、多查查资料,很多看起来莫名其妙的问题,其实都有据可查。