spring的@Transactional 可以注解到方法上或者类上,并且只有在 该类被作为spring容器托管的bean的时候,也就是使用@autowird 被注入到其他类中使用,调用该类的方法的时候才生效
因为此时调用方法会被spring容器的 TransactionInterceptor 拦截器拦截,并开启事务
如果是同一个类中的方法 调用 第二个方法 即this.方法 ,第二个方法的事务 是不起作用的,这种情况没有 mark-as roll异常
出现marked as rollback-only异常,是因为使用默认的@Transactional 注解,事务的传播性默认为Propagation.REQUIRED,调用其他类的 事务方法addPerson(user);
这个方法开启的事务是默认Propagation.REQUIRED,也就是沿用外层调用方法的事务 (如果有事务存在 则使用原事务 如果不存在则开启新事务)
外层方法开启了一个事务,内层方法调用的是其他类的事务方法,内层方法发现异常了,会标记整个事务为roll-back,但是外层方法捕获异常 return的时候 会执行commit事务 但是此时发现已经标记异常,所以才会抛出异常