spring事务
spring基于AOP实现了事务管理的功能。Spring启动时会创建相关的bean对象,如果扫描到@Transactional注解的类或方法,会根据@Transactional注解相关的参数进行配置注入,在代理对象中会处理相应的事务,对事务进行管理。
在默认情况下,方法抛出RuntimeException时回滚事务,也可以手动指定事务回滚的异常类型,如:
@Transactional(rollbackFor=Exception.class)
spring事务的三大核心接口:
- PlatformTransactionManager
- TransactionDefinifition
- TransactionStatus
3.1 spring事务传播机制
事务传播类型 | 类别 | 说明 |
---|---|---|
REQUIRED | 支持当前事务 | 如果当前没有事务,就创建一个事务;如果已经存在事务,就加入这个事务。Spring默认 |
SUPPORTS | 支持当前事务 | 支持当前事务,如果当前没有事务,就以非事务的方式执行。 |
MANDATORY | 支持当前事务 | 支持当前事务,当前操作必须存在事务,如果不存在,抛出异常。 |
REQUIRES_NEW | 不支持当前事务 | 如果当前存在事务,则把当前事务挂起,并重新创建新事务并执行,直到新事务提交或者回滚,才会恢复执行原来的事务。原有事务和新事务相互隔离 |
NOT_SUPPORTED | 不支持当前事务 | 以非事务的方式执行,如果当前操作在一个事务中,则把当前事务挂起直到当前操作完成再恢复事务执行 |
NEVER | 不支持当前事务 | 以非事务的方式执行,如果当前操作存在事务,抛出异常 |
NESTED | 嵌套事务 | 如果当前方法有一个事务正在运行,则这个方法应该运行在一个嵌套事务中,被嵌套的事务可独立于被封装的事务进行提交或回滚;如果当前没有活动事务,则按照REQUIRED机制执行 |
3.2 Spring事务失效场景
- 事务方法所在的类没有被Spring IOC容器管理
- 事务方法没使用public修饰
- 同一个类中的方法A和B均添加了事务注解,方法A调用方法B,则B的事务会失效
- 没有配置事务管理器
- 内部方法的事务传播类型为不支持事务NOT_SUPPORTED
- 捕获了异常没有抛出来
- 标注错误的异常类型,默认RuntimeException,如果抛出Exception异常,事务会失效