Spring事务总结
Spring事务总结
事务传播行为
事务传播行为用于表示一个事务里嵌套了另外一个事务时,事务之间的回滚关系。
而常用的有三个事务传播行为:REQUIRED、NESTED和REQUIRES_NEW。
本质来说,事务的回滚和事务的传播,取决于:
1. 是否有抛异常
2. 异常是否有经过spring的aop
3. 当异常经过多个aop时,这些aop事务的关系
传播行为 | 父方法开启了事务 | 父方法没开启事务 |
---|---|---|
REQUIRED | 父子方法同一事务 | 子事务各自独立 |
SUPPORTS | 父子方法同一事务 | 子方法无事务 |
MANDATORY | 父子方法同一事务 | 报错 |
NESTED | 父子方法父子事务 | 子事务各自独立 |
NOT_SUPPORTED | 父子方法各自独立 | 只回滚父事务,不回滚子事务 |
REQUIRES_NEW | 父子方法各自独立 | 子事务各自独立 |
NEVER | 报错 | 子事务各自独立 |
REQUIRED
如果父子方法都开启了事务,那么父方法和子方法是同一个事务。
即无论异常经过的是父方法还是子方法的aop,父子方法都会回滚。
如果只有子方法开启了事务,则子方法的事务各自独立,只回滚自己的。
NESTED
如果父子方法都开启了事务,父方法事务为父事务,子方法事务为子事务。
如果异常经过子事务aop,只回滚子事务。如果异常经过父事务aop,则父子事务都回滚。
REQUIRES_NEW
如果父子方法都开启了事务,父子方法的事务各自独立。
MANDATORY
要求父子方法都要开启事务,那么父方法和子方法是同一个事务,同REQUIRED。
如果只有子方法开启了事务,则报错。
SUPPORTS
如果父子方法都开启了事务,同REQUIRED。如果父方法没有开启事务,则父子方法都没有事务。
NOT_SUPPORTED
如果父子方法都开启了事务,父方法事务为父事务,子方法事务为子事务。
即无论异常经过的是父事务还是子事务的aop,只回滚父事务,不回滚子事务。
NEVER
要求父方法不能开启事务,否则报错。
参考文章: