spring 的事务传播级别就是AOP的体现,创建TransactionInterceptor和TransactionAspectSupport
A. required:支持当前事务,如果当前没有事务,就新建一个事务,这是Spring默认的事务的传播
B. supports:支持当前事务,如果当前没有事务,就以非事务方式执行;
C. mandatory:支持当前事务,如果当前没有事务,就抛出异常;
D. requireds new:新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作;
E. not supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;
F. never:以非事务方式执行,如果当前存在事务,则抛出异常;
G. nested:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
上述的意思是当前线程创建mysql的connect连接,在这个线程中的所有方法是否使用同一个connect连接,还是新建连接。
1.执行TransactionAspectSupport的invokeWithinTransaction()完成整个事务的流程
2.调用createTransactionIfNecessary()创建事务信息,根据用户配置的7种传播级别
3.getTransaction()获取事务对象的信息,是否新建
4.prepareTransactionInfo(),创建线程并将事务绑定到当前线程
5.retVal = invocation.proceedWithInvocation();执行被代理的方法,如果方法中存在别的事务方法,重新回到第一步