事务的传播机制
开启事务
- Spring Boot初始化时自动装配机制已自动开启事务支持
- 启动类加
@EnableTransactionManagement开启事务支持 - 方法加
@Transactional(propagation=Propagation.X)让该方法支持事务 - X一共有七种枚举值,每种枚举的事务传播机制不一样
- 事务的原理是动态代理,所以必须要有切面事务才起作用,同类方法之间互相调用事务不起作用。
- 如果确实需要调用同类方法,可以使用
AopContext.currentProxy()获取代理类
事务的传播机制
| 序号 | 枚举值 | 事务传播机制 |
|---|---|---|
| 1 | REQUIRED | 外层/当前没有事务,则新建事务。外层存在事务则加入该事务。一般用于需要保持父子事务一致时的业务。 |
| 2 | SUPPORTS | 如果当前存在事务,则加入该事务;如果当前不存在事务,则不使用事务。 |
| 3 | MANDATORY | 强制调用该方法的外层必须开启事务。如果外层存在事务则加入该事务,否则抛异常。 |
| 4 | REQUIRES_NEW | 无论外层有没有事务,都新建一个事务。 |
| 5 | NO_SUPPORTED | 即使外层开启了事务,也不使用。 |
| 6 | NEVER | 从不使用事务,如果外层开启了事务,则抛出异常。 |
| 7 | NESTED | 事务嵌套,外层存在事务,新开启事务。新开启的事务随主事务回退和提交。但子事务异常父事务可以处理异常后继续提交 |