spring事务理解

、1 REQUIRED  对当期事务的支持,如果当前没有事务就新建一个事务
@Transactional(propagation = Propagation.REQUIRED)

2 SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行
@Transactional(propagation=Propagation.SUPPORTS)

3MANDATORY 支持当前事务,如果当前没有事务,就抛出异常;不会执行程序的update 就是直接抛出了异常

@Transactional(propagation=Propagation.MANDATORY)

4REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起;(如果程序有异常会回滚之前的操作==有事务)

@Transactional(propagation=Propagation.REQUIRES_NEW)

5 NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;通俗的讲就是没有事务,如果有事务就把事务挂起不执行事务,有错不会回滚。

@Transactional(propagation=Propagation.NOT_SUPPORTED)

6 NEVER 以非事务方式执行,如果当前存在事务,则抛出异常;没有事务支持,如有方法中间有异常之前执行的不会回滚,如果方法有事务,就会抛出异常:以无事务的方式执行

@Transactional(propagation=Propagation.NEVER)

7NESTED 支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务:有事务会回滚。

@Transactional(propagation=Propagation.NESTED

总结:常用的就是如果没有事务就新建一个事务用REQUIRED ,不需要事务用NOT_SUPPORTED 

如果在service类中调service内部自己类的方法的是 事务是不起作用的 

声明式通注解@Tran的形式  事务是通通过AOP动态代理实现的,这样会产生一个代理类来做事务管理,而目标类(service)本身是不能感知代理类的存在的。

在方法 A 中调用方法 B,实际上是通过“this”的引用,也就是直接调用了目标类的方法,而非通过 Spring 上下文获得的代理类,所以事务是不会开启的。

如图:

如果在方法A上添加注解 @Transactional(propagation=Propagation.NOT_SUPPORTED) 目的是让 方法内容部 B 和C执行自己自带的事务而不会 传播到A上 其实不起作用

方法内部调用this 的 验证了这句话 实际上是通过“this”的引用,也就是直接调用了目标类的方法,而非通过 Spring 上下文获得的代理类,所以事务是不会开启的。

如果想实现该事务可以实现手动提交

 

posted @ 2018-02-28 17:11  暖暖-木木  阅读(103)  评论(0编辑  收藏  举报