要在项目中开启spring的事务的功能,会使用到@EnableTranstationMannager 开启spring 事务的功能
![](https://img.haomeiwen.com/i18205378/cc2818aa7b16a7d2.png)
![](https://img.haomeiwen.com/i18205378/d79b064fce55eb1c.png)
![](https://img.haomeiwen.com/i18205378/8cb7df682205e5e2.png)
![](https://img.haomeiwen.com/i18205378/1feee17f1b4f0b38.png)
![](https://img.haomeiwen.com/i18205378/85f0d6ac2af54f31.png)
![](https://img.haomeiwen.com/i18205378/4eee595726b663b2.png)
![](https://img.haomeiwen.com/i18205378/4c0d5a816475cf9a.png)
![](https://img.haomeiwen.com/i18205378/02e8ba201ad42743.png)
![](https://img.haomeiwen.com/i18205378/be249caa5fabb20a.png)
![](https://img.haomeiwen.com/i18205378/190b532f1c2cc52a.png)
到这里开启spring事务相关的需要用到的组件白手动添加到容器中:
然后我们来看看spring 事务功能开启需要视同的那个后置处理器对象:InfrastructureAdvisorAutoProxyCreator
这个时候和springAOP的实现基本上是一样的;查找@Tranation相关的注解然后生成代理对象:
![](https://img.haomeiwen.com/i18205378/54e5cab1fb94cd2c.png)
![](https://img.haomeiwen.com/i18205378/6eb9c118b35413f0.png)
![](https://img.haomeiwen.com/i18205378/d74204979063f82c.png)
![](https://img.haomeiwen.com/i18205378/8dcc6cca5c60129b.png)
![](https://img.haomeiwen.com/i18205378/612f8cf1b1c405ef.png)
![](https://img.haomeiwen.com/i18205378/9086fd4a2064d8eb.png)
![](https://img.haomeiwen.com/i18205378/5b1accf3dde41aeb.png)
![](https://img.haomeiwen.com/i18205378/90b2e14684046cb9.png)
![](https://img.haomeiwen.com/i18205378/d5583d83ea0de6be.png)
![](https://img.haomeiwen.com/i18205378/a7ee33d404ed9667.png)
![](https://img.haomeiwen.com/i18205378/9bb18839e1b64118.png)
![](https://img.haomeiwen.com/i18205378/589a18b82f14113d.png)
![](https://img.haomeiwen.com/i18205378/ac7834d8e32096b8.png)
![](https://img.haomeiwen.com/i18205378/baa2ce3baae62fba.png)
![](https://img.haomeiwen.com/i18205378/843d0c4d6c8936de.png)
![](https://img.haomeiwen.com/i18205378/fe88e80402721041.png)
![](https://img.haomeiwen.com/i18205378/aa2cd788eb471064.png)
![](https://img.haomeiwen.com/i18205378/24b071186e5c88f4.png)
![](https://img.haomeiwen.com/i18205378/31da06b67ac605df.png)
![](https://img.haomeiwen.com/i18205378/5044950187785300.png)
![](https://img.haomeiwen.com/i18205378/a6e860c6220bdf23.png)
![](https://img.haomeiwen.com/i18205378/097676bf287bf2c8.png)
![](https://img.haomeiwen.com/i18205378/e8b03a37b34c1cb2.png)
![](https://img.haomeiwen.com/i18205378/df1141b7e53307c0.png)
![](https://img.haomeiwen.com/i18205378/fe8e9ce1767d3ece.png)
到了这一步 当前创建的的这个对象在穿件代理对象的时候需要使用到的事务增强器都选出来了
![](https://img.haomeiwen.com/i18205378/ded467e700d7f951.png)
接下来就是事务的调用:
1.org.springframework.aop.framework.JdkDynamicAopProxy#invoke();
2.
![](https://img.haomeiwen.com/i18205378/7c8f9c2cc493fad4.png)
![](https://img.haomeiwen.com/i18205378/dfd0147b9c5238c5.png)
![](https://img.haomeiwen.com/i18205378/e68555fa65edcb19.png)
![](https://img.haomeiwen.com/i18205378/12c116be9862b8f2.png)
![](https://img.haomeiwen.com/i18205378/70a56fa394c0f3e1.png)
![](https://img.haomeiwen.com/i18205378/75f9e15af837c29f.png)
![](https://img.haomeiwen.com/i18205378/d9d7cf68c42ea48a.png)
![](https://img.haomeiwen.com/i18205378/2bf885dbabd028e1.png)
![](https://img.haomeiwen.com/i18205378/73564bad7eefea41.png)
![](https://img.haomeiwen.com/i18205378/541adb95613bda86.png)
![](https://img.haomeiwen.com/i18205378/2948454ebf4545ee.png)
重新执行ReflectiveMethodInvocation 中的 proceed()方法,执行责任链.
这里这里就是一个spring事务的调用的过程;
下面重点分析,spring事务的开启和执行:
![](https://img.haomeiwen.com/i18205378/12d81424bef64fdb.png)
![](https://img.haomeiwen.com/i18205378/db873d747b683b56.png)
![](https://img.haomeiwen.com/i18205378/6cf74dfe1505b857.png)
![](https://img.haomeiwen.com/i18205378/f2a25affec5615a7.png)
![](https://img.haomeiwen.com/i18205378/a03f4f93765da777.png)
![](https://img.haomeiwen.com/i18205378/db744bfdabc509a5.png)
![](https://img.haomeiwen.com/i18205378/af8b4f64a1df20c3.png)
![](https://img.haomeiwen.com/i18205378/482b014831835350.png)
判断当前线程时候存在事务,通过ConnectionHolder 不为空并且事务已经激活了这个时候当前线程就存在事务
![](https://img.haomeiwen.com/i18205378/e773aa10bdb4343c.png)
![](https://img.haomeiwen.com/i18205378/4eaeb0c79fceeaef.png)
![](https://img.haomeiwen.com/i18205378/65d1c9bba8b12fac.png)
![](https://img.haomeiwen.com/i18205378/2f55c8ef411253f7.png)
![](https://img.haomeiwen.com/i18205378/8745965f206fb2fb.png)
![](https://img.haomeiwen.com/i18205378/69d298c421a78d8c.png)
![](https://img.haomeiwen.com/i18205378/d109c1e17afee5b0.png)
如果存在嵌套事务的时候:会走下面的逻辑
![](https://img.haomeiwen.com/i18205378/e164634cbb8b5674.png)
通过不同的事务传播机制执行不同的逻辑:
![](https://img.haomeiwen.com/i18205378/e9ffbdffd34a0741.png)
下面以Requires_new为例:
![](https://img.haomeiwen.com/i18205378/ff7f99de259f9e62.png)
当内层事务处理之后,回到TransactionStatus对象中的挂起的事务设置为当前事务
![](https://img.haomeiwen.com/i18205378/3bdbe8e8a3013a86.png)
![](https://img.haomeiwen.com/i18205378/74cad4fcac1e60c6.png)
网友评论