Seata源码笔记

典型的JDBC缩影,肯定是有不用,代码不同,分布式事务,开启事务,原来实在本地执行,然后,会在全局事务
连接一个库,数据库在哪里gaobal_事务,全局事务,branch table 保持分支数据的,我们首先的思路,我么这次调用,
完全的分布式事务,全局的事务中之心的,Order 本地职务和product 本地事务,两个表如何理解,映射为我们的单位表,
订单项的通过什么来关联呢?订单和订单项,全局事务ID,读写分离,和Seater-server 请求找那个,业务操作,写一条数据,
第一步执行完了,执行业务逻辑的代码,保存订单,插入订单库,远程调用product 服务 扣减库存,配置一个数据源的代理,
我么这里的代理类,dataSourceProcy 方法,设置代理数据源,说白了就是一个Insert操作,然后记性分支事务的注册,向我们的
bracnch 数据的插入一掉数据,紧接着进行事务的提交,本地的数据库的,真正的提交,是否正常,分支事务,业务逻辑就是把异常的状态,
把brache 状态改为1,判断提交本地事务是否成功,
紧接着执行调用product 服务,在这里执行,注册分支事务,交本地数据,来判断是代理数据开源
提交本地是否成功,结果是正常的,马上去说,seata 的设计理念,
Order库, undo-log  表,设计的核心逻辑是假如说,
业务SQL,seata 的核心,会做两个镜像,会做两个镜像,
select  * from product where product_id for update(84);
update product set count=count-1 where product_id=1
select  * from product where product_id for update(84);
将2个镜像保存到数据里面种去,反序列化的形成,数据是什么样的呢?
保存生成一个save镜像。要想被识别的话,要有个AOP自己去切,析一下依赖,
直接看一下,自定义的启动器,点击Spring boot 自动装配原理。
Seata 自动,配置了一个bean,好像我么的由个Goal session 解析的注解的,解析我们的bean 
研究这个类,实现什么Spring的接口,@global, AbstractpOrocyCreateot ,自动代理对象的,
warpIfNecessary()方法啊,核心逻辑是不是TCC模式,比较有切入性,下面的TCC,解耦进入下面的逻辑传进来,拿到我们,判断
是不是存在注解,有这个注解的方法,存在这个注解,创建一个golgaTransional ,成一个代理对象,生成一个OrderServiceImpl
拦截器,拦截注解的,initliaze 调用接口实现,after initclinet()方法,其实就做了2个事情,关键性的RMclient,init
TMclient ,初始化TMclient ,rclient的方法,现在非常好,按照debug的方式启动,我们把debug 模式启动之后,接口前端请求,
已经是个代理对象,还记得是GlobalTranssInterceptr ,断点子invoke 方法里面来,现在debug 模式启动,此时直接f8,对应的直接的
拦截器拦截住,首先会目标兑现的client,全部锁的标准,有个逻辑分支判断,handGloabal,接着处理handGolodTranscation,执行
execute    方法,主要的逻辑是对应的execute 方法,主要执行的死匿名对象的方法,name方法,点击去的时候,getCurnetCreate();
获取当前的事务,想一想分布式事务创建还是获取,beign 事务进行逻辑的判断,只有事务的管理者的才有TM才有对应的发起者方法,
角色判断,调用begin 来看一下,最同步调用的,TMRPc lient的方法,TM client 是不是这里,懂了的话,call 个1,有些代码,全局事务
业务逻辑的分支事务注册上面,发起请求之后,会被Seatasever接口者的,协调者的饭方法,底层调用defalut 库,默认的
协调者,dogalobegin 方法,core,bein 之后最终调用,全局事务开启,第一步的,好,非常简答的一件事情,创建
一个全部session 最终会被gobal session 创建一个对象,加了一个监听,使用了观察者模式,添加一个监听,
点进去看一下,这个东西默认的上面去找,init方法,逻辑的分支的判断,文件模式的,搭建模式的话,load 出一个底层的SPI的,默认的数据库的
Session,数据库的Session。begin()方法,理解的那个SessionMange,调用,执行我们的业务逻辑,减少我们的逻辑判断,
执行我们的业务操作,做了一个优化,如何进行拦截的,前置镜像,后置镜像,insert, delete 语句有后置镜像吗?
就是这个两句SQL,
存在前置镜像,由于后置镜像的
代理数据源:原生的(prepareStatement):怎么去猜呢?直接去搜这个类,PrepaStatement这个类,就是代理我们的代理,
找到这个代理类,找到exceute 方法,点击的方法,exceute 方法,执行请求自行,代理对象,首先方法,SQL识别,创建SQL的
sqlRecongier方法,代理者四种语句的方法,slect 方法,结构调整的方法,不然如果我么这里。  
真正的逻辑是doExcute方法,最终是调用我们这里的方法,这么多的东西,这么多的东西的原理图,
生成undoog对象,怎么能保证不被其他线程打算,加锁,


另外还是申请这个表,还是注册这个表,数据的,操作也是这个表的结构,存在所冲突的方法,锁冲突能regitst异常的话,
外面的额就有一个铺货的方法,抛出锁冲突异常,线层睡依稀,30ms 10次,300 ms 还没有拿到的话,获取资源失败,资源则所的
失败。重试10次,每次30毫秒,回滚的方法设计思路。

发布了640 篇原创文章 · 获赞 12 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/xiamaocheng/article/details/105082874