Spring spring

Spring中文网站 > Spring Batch > Spring MVC如何管理事务 Spring MVC如何做环境隔离
Spring MVC如何管理事务 Spring MVC如何做环境隔离
发布时间:2026/08/20 11:44:37

品牌型号:联想ThinkPad X1

系统:Windows10家庭版

软件版本:Spring 5.3.7

做Java后端开发这些年里,在项目中遇到了很多容易踩坑的地方,例如事务控制与环境隔离。我们在写Spring MVC项目的时候,以为添加事务注解就能万事大吉,实际出现本该回滚未回滚、误回滚等问题,根源大多是不熟悉事务传播机制。环境隔离也是,开发、测试、生产环境混用,频繁修改配置,极易误将测试数据写入生产数据库。下面给大家介绍一下Spring MVC如何管理事务,Spring MVC如何做环境隔离的相关内容。

一、Spring MVC如何管理事务

Spring MVC并不独立提供事务管理能力,事务能力由 Spring核心容器、Spring Data模块实现。MVC层只是把请求接进来,真正干活的是Service层,我们如果想搞清楚事务管理,就需要清楚这套机制挂在哪里。

事务管理常见的做法是用@Transactional注解,标注在Service方法上,底层靠AOP动态代理去拦截方法调用,方法执行前开事务,执行完提交,出异常就回滚。我们新手常踩坑的地方是@Transactional加在Controller层基本不生效,因为Spring默认只对public方法做代理,而且事务应该管到业务逻辑层而不是控制层。

使用@Transactional注解
图1:使用@Transactional注解

事务传播行为默认是REQUIRED有事务就加入没有就新建,但项目里经常需要用REQUIRES_NEW去开一个独立事务。比如记录日志这种操作,不能因为主业务回滚就把日志也回滚了。回滚规则我们也经常容易出错,Spring默认只在遇到RuntimeException和Error时回滚,如果抛的是受检异常,不特殊声明rollbackFor,事务一样会提交。

事务的传播行为
图2:事务的传播行为

Spring Boot项目一般不用额外配置,引入spring-boot-starter-data-jpa或者mybatis相关依赖后,事务管理器会自动装配,如果是传统XML配置的项目就需要显式声明DataSourceTransactionManager,再配合tx命名空间开启注解驱动。

添加依赖
图3:添加依赖

二、Spring MVC如何做环境隔离

环境隔离说白了就是让开发、测试、生产这几套环境各用各的配置互不干扰,这样我们才不至于本地调试的时候一不小心动到线上环境的配置,在Spring里常用的手段是profile机制。

1、我们创建application-dev.yml、application-test.yml、application-prod.yml这三种不同名的yml文件,把不同环境的数据库地址、端口、日志级别分开写,启动的时候用spring.profiles.active指定加载哪一份。

profile机制
图4:profile机制

2、在真实项目开发的时候如果仅profile还不够,数据库连接、Redis地址、第三方接口密钥这些敏感信息,一般不建议大家写死在配置文件里,像生产环境的账号密码,写在代码仓库里本身就是有风险的。比较稳妥的做法是把这些配置放到环境变量里,或者用配置中心去管理,像Nacos、Apollo这类工具,可以做到不重新打包就切换配置,运维起来也方便。

读取系统环境变量
图5:读取系统环境变量

3、打包部署的时候Maven的profile和Spring的profile我们要注意下,这是两个不同的概念,很多人容易搞混,Maven的profile管的是打包过程中要不要替换资源文件,Spring的profile管的是运行时加载哪套bean和配置,两者可以配合使用。

Maven中的profile
图6:Maven中的profile

以上就是Spring MVC如何管理事务,Spring MVC如何做环境隔离的全部内容了。写到这儿基本把事务和环境隔离这两块的核心问题都捋过一遍了。事务这边,我们要记住@Transactional只对public方法生效,别乱加在Controller层,传播行为和回滚规则该看文档要记得看文档。环境隔离这方面,虽然profile机制能解决配置分离的问题,但敏感信息还是得挪到环境变量或者配置中心去管,容器化部署时环境变量的优先级也别忘了。

180 1563 6924