spring事务源码解析
2024-03-01 15:47 Spiderman25 阅读(75) 评论(0) 收藏 举报在实例初始化后





首先获取事务的切面信息



返回容器中所有Advisor的实例。

再回到这




拿到所有的类

随后对所有类的方法进行遍历



把方法对应的事务属性放到缓存中,这个attributeCache就是在advisor实例中的(不一定是直接属性)

最后生成代理对象,缓存存放的位置如下

下面以正常提交的单个service例子演视



获取每个方法对应的事务属性

从缓存中获取代理的这个方法对应的事务属性

获取事务管理器

从容器中取出事务管理器并放到缓存中

强转

获取方法名


先看下类信息

获取事务状态



从本地线程中获取事务状态


由于前面没有存在事务,所以不走

这个也不用管,传空并且没有同步的事件,所以里面没有逻辑处理

否则会回调

继续看,这里表示开始事务






正常走上面的没有任务逻辑处理

如果是自动提交改为手动提交

如果允许强制只读以及本次为只读就执行如下命令

把连接绑定到本线程中


回到这里





然后执行实际方法


清理事务信息

设置为以前老的信息

最后提交事务





触发事件




















正常逻辑完成
再看下抛异常的






触发事件



事件




最后还是把异常抛出

完成。
浙公网安备 33010602011771号