数据库事务( 五 ) Spring管理事务的几道面试题

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
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。执行完当前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值