seata的原理
2022-02-20 本文已影响0人
hangjun
整体机制
两阶段提交协议的演变:
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。
AT模式
一阶段:
1.tm开启一个全局事务,seata服务器返回xid
2.执行第一个本地事务(2.1前置镜像 2.2执行sql 2.3后置镜像),注册分支事务
3.feign调用第二个本地事务(3.1前置镜像 3.2执行sql 3.3后置镜像),注册分支事务
二阶段:
1.没有异常的情况,tm全局提交到tc,tc删除全局事务、分支事务
2.有异常的情况下,tm全局提交到tc,tc删除全局事务、分支事务,通知各个rm进行回滚操作
代码层面:
1.@SeataAutoConfiguration 和@GlobalTransitionAutoConfiguration
会注册一个BeanPostProcessor,名字是:GlobalTransactionScanner。
2.GlobalTransactionScanner.afterProperties()会初始化rm,tm,异步开启注册请求、重试请求、接受数据的线程池
3.GlobalTransactionScanner.wrapIfxxx()方法在生成动态代理对象的的时候会增加一个GlobalTransactionInterceptor.
这个类内部调用一个TransactionTemplate的模板类,模板类提供创建全局事务、创建分支事务、执行业务逻辑处理、提交、回滚
前置镜像和后置镜像还有注册分支事务都是通过代理datasource得到一个datasourceProxy里面处理的。