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 上下文获得的代理类,所以事务是不会开启的。
如果想实现该事务可以实现手动提交