面试——Spring事务管理

本文详细介绍了Spring框架中事务管理的基本概念、使用方法及其注意事项。包括@Transactional注解的使用技巧、事务传播行为的理解与配置,以及不同传播属性的应用场景。

一、@Transactional

注意事项:如果动态代理使用的是jdk默认的动态代理,那么进行@Resource注入的时候,一定要给接口注入对象,而不是给实现类注入对象。因为aop底层是基于业务层接口通过反射构造实现类对业务方法进行执行的。所以必须注入接口。不然会报BeanNotRequiredException。

二、事务的管理

@Transactional(readonly=true),在业务方法上添加该注解

“只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。 

三、事务的传播

事务的传播:业务重构的时候需要业务方法调用业务方法,这就需要一个业务方法的事务传播到另一个业务方法中,整合为一个事务。


举例就是——一个业务方法内调用了其他的业务方法,也就是说一个业务是由多个事务(或者业务)组成并合成一个事务的。这时候我们为了保持事务的原子性与一致性,要在这多个业务方法上增加@Transactional注解。就可以保持事务的原子性与一致性。一旦这个业务中的某个业务发生了异常,那么所有事务都不会commi

四、事务传播(propagation)属性

重点掌握 Propagation.REQUIRED

  1. @Transactional(propagation=Propagation.REQUIRED)
    • 需要事务, 如果没有事务创建新事务, 如果当前有事务参与当前事务
  2. @Transactional(propagation=Propagation.MANDATORY)
    • 必须有事务, 如果当前没有事务就抛异常
  3. @Transactional(propagation=Propagation.NEVER)
    • 绝不, 绝对不能有事务, 如果在事务中调用则抛出异常
    • 在业务方法上打此标签,事务是具有原子性,但是事务不参与传播,一旦在别的业务方法中调用此业务方法,则会抛出异常
  4. @Transactional(propagation=Propagation.NESTED)
    • 嵌套, 必须被嵌套到其他事务中
  5. @Transactional(propagation=Propagation.NOT_SUPPORTED)
    • 不支持事务
  6. @Transactional(propagation=Propagation.SUPPORTS)
    • 支持事务, 如果没有事务也不会创建新事务
  7. @Transactional(propagation=Propagation.REQUIRES_NEW)
    • 必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务.

### Spring 事务管理原理解析 #### 平台事务管理器(PlatformTransactionManager) Spring事务管理核心依赖于 `PlatformTransactionManager` 接口,它是 Spring 提供的一个抽象接口,用于定义事务的基本操作,例如开启事务、提交事务以及回滚事务等功能[^2]。不同的数据访问技术对应着不同类型的事务管理器实现类,比如针对 JDBC 数据库操作的 `DataSourceTransactionManager`。 #### 事务传播行为 事务传播行为是指当多个事务方法相互调用时,如何处理这些事务之间的关系。默认情况下,Spring 使用的是 `REQUIRED` 传播行为,这意味着如果当前不存在事务,则会创建一个新的事务;如果已经存在事务,则加入现有的事务中执行业务逻辑[^5]。 #### 声明式事务 vs 编程式事务 - **声明式事务**:通过配置文件或者注解的方式完成事务控制,简化了开发流程。最常用的注解形式就是 `@Transactional`,它能够自动管理和维护事务生命周期。 - **编程式事务**:需要开发者手动编写代码来显式地启动、提交或回滚事务,这种方式更加灵活但也更复杂[^3]。 #### @Transactional 注解的工作机制 `@Transactional` 是 Spring 中用来标注某个方法或类以启用声明式事务的核心注解。其工作过程大致如下: 1. 当应用程序运行至被标记的方法前,AOP代理对象拦截请求; 2. AOP切根据预设规则决定是否应该开启新事务还是参与已有事务; 3. 如果满足条件,则由具体的 Transaction Manager 实现负责实际的操作——如设置隔离级别、超时参数等; 4. 方法正常结束时尝试提交事务;遇到异常情况则依据策略判断是否应回滚事务。 #### 默认事务属性总结 - **传播机制**: 默认为 `REQUIRED`。 - **隔离级别**: 默认采用数据库自身的隔离等级,默认通常是 `REPEATABLE_READ`。 - **只读标志(read-write)**: 默认允许写入操作。 - **超时设定**: 若底层支持,则遵循指定值(如未特别指出一般取50秒),否则忽略此选项。 - **回滚规则**: 自动对所有的 unchecked exception 进行回滚,而 checked exceptions 则需额外声明才会触发回滚动作。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void registerUser(User user){ // business logic here... userRepository.save(user); } } ``` 上述例子展示了如何利用 `@Transactional` 注解轻松实现注册用户的整个过程中涉及的数据持久化都处于同一个事务之下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值