面试题答案
一键面试Java Spring项目里事务管理的具体实现方式
- 编程式事务管理:通过
TransactionTemplate
或者直接使用PlatformTransactionManager
来管理事务。开发者在代码中手动编写事务的开始、提交、回滚等操作。 - 声明式事务管理:基于AOP实现,通过在配置文件或者使用注解的方式,将事务管理逻辑从业务代码中分离出来。业务方法只需关注业务逻辑,事务管理由Spring框架负责。
编程式事务优缺点及适用场景
- 优点:
- 灵活性高,可以在代码的任何位置精确控制事务边界。
- 对于复杂的事务控制逻辑,如根据不同条件决定是否提交或回滚事务,编程式事务更容易实现。
- 缺点:
- 代码侵入性强,业务代码和事务管理代码耦合度高,不利于代码的维护和复用。
- 大量重复的事务管理代码,增加开发工作量。
- 适用场景:适用于复杂的、特殊的事务控制场景,比如多个不同数据源的事务协同操作,且需要精细控制事务边界的情况。
声明式事务优缺点及适用场景
- 优点:
- 非侵入式,业务代码和事务管理代码分离,提高代码的可维护性和复用性。
- 配置简单,通过注解或XML配置即可完成事务管理,开发效率高。
- 缺点:
- 灵活性相对较低,对于一些极其复杂的事务控制场景难以满足需求。
- 由于基于AOP实现,可能会对性能有一定影响,尤其是在大量小事务的情况下。
- 适用场景:适用于大多数常规的业务场景,如简单的增删改查操作,事务边界清晰且不需要复杂控制逻辑的场景。
声明式事务配置和使用示例
- 基于注解配置:
- 开启事务管理:在Spring配置类上添加
@EnableTransactionManagement
注解。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration @ComponentScan(basePackages = "com.example.demo") @EnableTransactionManagement public class AppConfig { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
- 在业务方法上使用注解:在需要事务管理的业务方法或类上添加
@Transactional
注解。
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Transactional public void saveUser() { // 业务逻辑,如数据库操作 } }
- 开启事务管理:在Spring配置类上添加
- 基于XML配置:
- 配置事务管理器:在Spring的配置文件(如
applicationContext.xml
)中配置DataSourceTransactionManager
。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
- 开启事务管理:使用
<tx:annotation-driven>
标签开启声明式事务支持。
<tx:annotation-driven transaction-manager="transactionManager"/>
- 在业务方法上使用注解:与基于注解配置相同,在需要事务管理的业务方法或类上添加
@Transactional
注解。
- 配置事务管理器:在Spring的配置文件(如