1.Spring中的事务管理是如何实现的?
Spring 框架提供了两种机制来管理应用程序中的事务。分别为编程式事务管理和声明式事务管理, 建议使用非入侵式的声明式事务管理, 通过配置文件或者注解来管理事务。
声明式事务管理底层是基于数据库事务和AOP机制的。
1.1.实现步骤
1.1.1.配置事务管理器 (Transaction Manager)
- Spring 需要一个事务管理器来实际执行事务的开启、提交、回滚等操作。
- 通常会配置一个与持久化技术(如 JDBC、JPA、Hibernate 等)相匹配的事务管理器。
- 对于 JDBC 和 JdbcTemplate,可以配置
DataSourceTransactionManager。 - 对于 MyBatis , 默认事务管理器也是
DataSourceTransactionManager, 因为 MyBatis 通常使用 JDBC 方式访问数据库,所以事务管理也依赖于DataSource。 - 对于 JPA,可以配置
JpaTransactionManager。这个事务管理器使用实体管理器工厂(EntityManagerFactory)来管理事务。 - 对于 Hibernate,默认事务管理器也是
JpaTransactionManager,因为 Hibernate 是 JPA 的一种实现。当使用 Hibernate 作为 JPA 提供者时,Spring Boot 会自动配置JpaTransactionManager。 - 对于 NoSQL 数据库如 MongoDB , 默认事务管理器是
MongoTransactionManager。
- 对于 JDBC 和 JdbcTemplate,可以配置
1.1.2.启用事务注解驱动 (Enable Transaction Annotation Support)
-
要让 Spring 识别并处理
@Transactional注解,需要在配置中启用事务注解驱动。 -
在 XML 配置中,可以通过
<tx:annotation-driven>标签实现。<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 启用事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> -
在 Java 配置中,通过
@EnableTransactionManagement注解启用。@Configuration @EnableTransactionManagement public class AppConfig { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } // 其他 Bean 定义... }
1.1.3.使用事务注解 (@Transactional)
-
Spring 支持在类或方法上使用特定的事务注解来声明事务边界。
-
最常见的注解是
@Transactional,它可以放在类或方法上。@Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void createUser(User user) { userRepository.save(user); } }
1.1.4.AOP 代理与拦截 (AOP Proxy and Interception)
-
首先对于使用了
@Transactional注解的Bean,Spring会创建一个代理对象作为Bean, 当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解 -
如果加了,那么则利用事务管理器创建一个数据库连接, 并且修改数据库连接的autocommit属性为false, 禁止此连接的自动提交,这是实现Spring事务非常重要的一步
-
然后执行当前方法,方法中会执行sql。执行完当前

最低0.47元/天 解锁文章
46万+

被折叠的 条评论
为什么被折叠?



