什么是 spring 事务
spring 事务是 spring 框架提供的一种统一事务管理机制,用来保证数据操作的一致性和完整性。它通过声明式(基于注解或 xml 配置)或编程式(手动调用 api)两种方式,简化了事务的开启、提交和回滚逻辑。底层上,spring 事务抽象屏蔽了不同持久化技术(如 jdbc、hibernate、jpa)的差异,让开发者能以一致的方式处理事务,从而避免数据不一致或部分提交的问题。
换句话说,spring 事务的核心价值在于:简化事务管理、统一编程模型、确保数据安全可靠。
spring boot 自动配置类 transactionautoconfiguration
包:org.springframework.boot.autoconfigure.transaction
类:transactionautoconfiguration
自动配置的部分核心源代码如下:
@autoconfiguration @conditionalonclass(platformtransactionmanager.class) public class transactionautoconfiguration { @configuration(proxybeanmethods = false) @conditionalonsinglecandidate(platformtransactionmanager.class) public static class transactiontemplateconfiguration { @bean @conditionalonmissingbean(transactionoperations.class) public transactiontemplate transactiontemplate(platformtransactionmanager transactionmanager) { return new transactiontemplate(transactionmanager); } } @configuration(proxybeanmethods = false) @conditionalonbean(transactionmanager.class) @conditionalonmissingbean(abstracttransactionmanagementconfiguration.class) public static class enabletransactionmanagementconfiguration { @configuration(proxybeanmethods = false) @enabletransactionmanagement(proxytargetclass = false) @conditionalonbooleanproperty(name = "spring.aop.proxy-target-class", havingvalue = false) public static class jdkdynamicautoproxyconfiguration { } @configuration(proxybeanmethods = false) @enabletransactionmanagement(proxytargetclass = true) @conditionalonbooleanproperty(name = "spring.aop.proxy-target-class", matchifmissing = true) public static class cglibautoproxyconfiguration { } } }
下面我们拆开来分析
@conditionalonclass(platformtransactionmanager.class)
spring boot 自动配置的先决条件是类路径 classpath 下存在 platformtransactionmanager 这个类;spring boot 下引用 “spring-boot-starter-jdbc” 这个依赖时会间接引用这个类的。
@configuration(proxybeanmethods = false) @conditionalonsinglecandidate(platformtransactionmanager.class) public static class transactiontemplateconfiguration { @bean @conditionalonmissingbean(transactionoperations.class) public transactiontemplate transactiontemplate(platformtransactionmanager transactionmanager) { return new transactiontemplate(transactionmanager); } }
使用 spring 事务,必须要给到 platformtransactionmanager ,这里要求 spring 容器中必须存在唯一候选的实现 platformtransactionmanager 接口的类的 bean,自定义 bean 的代码可以参考如下:
@configuration public class datasourceconfig { @bean @conditionalonmissingbean public datasource datasource() { return new drivermanagerdatasource("jdbc:mysql://localhost:3306/your_database", "username", "password"); } @bean @conditionalonmissingbean public platformtransactionmanager transactionmanager(datasource datasource) { return new datasourcetransactionmanager(datasource); } }
如果 spring 容器中不存在 transactionoperations 接口实现类的 bean 的话,会自动创建一个 单例的 bean(transactiontemplate 类实现了 transactionoperations 接口),此 bean 的名称为 “transactiontemplate”。
那 transactiontemplate 都使用在哪些场景呢?
- transactiontemplate 是 spring 提供的编程式事务管理工具,用于在代码中显式控制事务的开启、提交和回滚。
- 它通过回调机制(
execute
方法)将事务逻辑与业务逻辑分离,避免手动编写繁琐的try-catch-finally
事务控制代码。 - 使用时可以灵活设置事务传播行为、隔离级别和超时时间,满足不同业务场景的需求。
- 适合在 无法使用声明式事务(@transactional) 的场景下,或需要对事务边界进行更细粒度控制时使用。
- 常见应用场景包括:批量操作中部分步骤需要独立事务、跨方法调用时避免事务传播问题、或在框架/工具类中封装事务逻辑。
@configuration(proxybeanmethods = false) @conditionalonbean(transactionmanager.class) @conditionalonmissingbean(abstracttransactionmanagementconfiguration.class) public static class enabletransactionmanagementconfiguration { @configuration(proxybeanmethods = false) @enabletransactionmanagement(proxytargetclass = false) @conditionalonbooleanproperty(name = "spring.aop.proxy-target-class", havingvalue = false) public static class jdkdynamicautoproxyconfiguration { } @configuration(proxybeanmethods = false) @enabletransactionmanagement(proxytargetclass = true) @conditionalonbooleanproperty(name = "spring.aop.proxy-target-class", matchifmissing = true) public static class cglibautoproxyconfiguration { } }
上面这个配置类的作用,是为 spring 的声明式事务管理(即使用 @transactional
注解) 启用合适的 aop 代理机制:
@enabletransactionmanagement
本身就是开启基于 aop 的事务管理的关键注解。proxytargetclass
参数决定了 spring 在为@transactional
方法生成代理时,使用 jdk 动态代理(接口代理)还是 cglib 子类代理。proxytargetclass = false
→ 使用 jdk 动态代理(要求目标类有接口)。proxytargetclass = true
→ 使用 cglib 代理(通过生成子类实现代理,适合没有接口的类)。
- 这段配置通过
@conditionalonbooleanproperty(name = "spring.aop.proxy-target-class", …)
来根据配置文件中的spring.aop.proxy-target-class
属性,自动选择 jdk 或 cglib 代理。 - 因此,它确实是针对
@transactional
注解生效时所依赖的代理机制 的配置。
使用transactiontemplate 显式控制事务
@autowired private transactionoperations transactiontemplate; @override public list<string> listdepartmentsbycorpid(string corpid) { return transactiontemplate.execute(status -> list.of("dingtalk_dept1", "dingtalk_dept2")); }
使用spring 的声明式事务管理(即使用@transactional注解)
@transactional(rollbackfor = exception.class) public list<string> listdepartmentsbycorpid(string corpid) { return list.of("dingtalk_dept1", "dingtalk_dept2"); }
总结
spring boot 通过 transactionautoconfiguration
自动装配事务管理器和 transactiontemplate
,让开发者在引入数据源依赖后即可开箱即用事务功能,无需手动配置。它同时启用基于 @transactional
的声明式事务管理,并根据 spring.aop.proxy-target-class
自动选择 jdk 动态代理或 cglib 代理
到此这篇关于spring boot 自动配置之 spring transaction的文章就介绍到这了,更多相关spring boot 自动配置spring transaction内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论