这篇笔记里面来学习一下Spring的事务的传播行为
首先看下有哪几种传播
REQUIRED
表示如果当前有事务,就加入该事务。如果当前没事务,就新起一个事务SUPPORTS
表示如果当前有事务,就加入该事务。如果当前没事务,则以非事务运行MANDATORY
表示如果当前有事务,就加入该事务。如果当前没事务,则报错REQUIRES_NEW
表示如果当前有事务,则当前事务被挂起,并新起一个事务。如果当前没事务,新起一个事务NOT_SUPPORTED
表示不管当前是否有事务,则以非事务运行,如果当前有事务则当前事务会被挂起NEVER
表示不支持事务。如果当前有事务,则报错NESTED
表示如果当前有事务,则会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独提交或回滚。如果当前没事务,则新起一个事务。
同一个类NemoService
里面的A和B两个方法,假如说A的事务传播行为是REQUIRED
,B的事务传播行为是REQUIRES_NEW
,A内部调用了B。当我们在外面使用@Autowire
获得了NemoService
的bean nemoService
,并且调用nemoService.A()的时候,其实B并没有新起一个事务。这是由于Spring AOP的底层原理是动态代理,由于A内部调用了B,所以B是没有被增强过的即@Transactional不起作用。