Java开发-面试题-0036-Spring 事务管理方式有哪些
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
(技术)微信公众号:CodeZeng1998
(生活)微信公众号:好锅
其他平台:CodeZeng1998、好锅
PS:之前遇见过的一家小公司的面试题,刚开始有点小懵逼,太久没背八股文了,突然有点忘记这块内容了,后续找面试官要了点提示才想起来。自己回答的时候顺便扩展了一些事务失效的情况,以及被延伸到Spring 代理方式相关的内容,因为回答事务失效的情况的时候项目里面一般使用注解
@Transactional
比较多,里面会涉及到@Transactional
的实现是基于Spring AOP 实现的,所以当类的自调用的情况会导致事务失效,因为AOP是需要基于代理类来实现对应的功能,所以各位回答这道面试题的时候可以扩展说明这块内容。
Spring 的事务管理方式主要有两种:==编程式事务管理和声明式事务管理。==这两种方式都有各自的应用场景和优缺点,Spring 强烈推荐使用 声明式事务管理,但了解编程式事务管理同样有助于理解事务的工作原理。下面是对这两种事务管理方式的详细说明。
1. 编程式事务管理
编程式事务管理是指通过手动控制事务的开始、提交和回滚。这种方式更灵活,因为开发者可以完全控制事务的生命周期和行为,通常是通过 Spring 提供的 TransactionTemplate
或 PlatformTransactionManager
来实现。
编程式事务管理的实现方式:
- TransactionTemplate:Spring 提供的一个方便的事务管理类,它简化了事务的控制,开发者只需定义事务逻辑,事务的开始、提交和回滚由
TransactionTemplate
处理。 - PlatformTransactionManager:这是 Spring 中用于管理事务的核心接口,不同的事务管理器实现了这个接口,比如
DataSourceTransactionManager
用于 JDBC 事务管理,JpaTransactionManager
用于 JPA 事务管理等。通过这个接口,开发者可以手动控制事务。
编程式事务管理的优缺点:
- 优点:
- 灵活,适合需要手动控制事务的复杂场景。
- 开发者可以精确控制事务边界(如部分提交、回滚)。
- 缺点:
- 代码侵入性强,事务代码和业务逻辑混在一起,难以维护。
- 不适合大部分日常开发任务,容易导致代码重复。
使用示例:
@Autowired
private TransactionTemplate transactionTemplate;
public void someServiceMethod() {
transactionTemplate.execute(status -> {
try