【微服务】(十六)—— 分布式事务Seata_seata group_机智兵的博客-CSDN博客
A(Atomic):原子性
C(Consistency):一致性
I(Isolation):隔离性
D(Durability):持久性 持久到数据库中
分布式事务指事务的参与者,支持事务的服务器,资源服务器以及事务管理器分别位于不同分布式系统的不同节点之上。
C一致性 3个节点,一个节点更新,另外两个节点的数据应该一起更新
A可用性 合理的时间返回合理的响应
P分区容错性 网络原因,网络断开,保证一部分出错,另一部分还能工作
要么AP 要么CP C和A相互冲突
Basically Available(基本可用)
soft state(软状态) 允许中间状态存在,但是是最终一致的
Eventually Consistent(最终一致性)
优点:尽量保证了数据的强一致性,实现成本较低,在主流数据库都有自己实现,对于MYSQL是从5.5开始支持(XA)。
缺点:单点问题 同步阻塞 数据不一致
优点:引入超时机制 多了一次询问阶段
缺点:
问:什么是无侵入?什么是自动补偿?
问:什么是长事务?
注意:分布式事务能不用尽量不要用,引入了会引入很多相关的问题
事务管理器 Transaction Manager 开启事务,提交事务
问:没懂TC存在的意义,RM直接与TM通信不行么?
TM开启一个事务,创建一个事务ID,XID是分布式事务的唯一标识,
每个小服务会注册一个分支事务
配置项 | 配置内容 |
registry.conf | 配置服务端注册中心和配置中心相关信息 |
file.conf | registry.type=file或者config.type=file时会用到 |
store.mode=db | 需要三张表:global_table.branch_table.lock_table |
Server端存储模式(store.mode)支持三种:
-file:单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高
-db:高可用模式,全局事务会话信息通过db共享,相应性能差些
-redis:Seata-Server1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置
第一步 从官网下载源码 解压
第二步 创建数据库
第三步 修改file.conf
第四步 启动
DataSourceProxyConfig 数据库代理配置
数据源的集合dataSourceMap
DynamicDataSourceContextHolder
DynamicRoutingDataSource
用分布式事务解决
第十个知识点 Seata接入微服务应用
第一步 修改registry.conf
注册中心 type="nacos"
配置中心也用nacos
Nacos配置Seata的信息
XA模式 TCC模式 Saga模式 AT模式
1.XA模式
XA协议是什么?
MYSQL对XA协议的实现
意思就是 可以在MYSQL里边,用XA的那几个命令
Seata XA
问这是在干什么?
seata实现分布式事务 XA是个协议
问:XA是个怎样的协议 是干什么用的?
【微服务】(十六)—— 分布式事务Seata_seata group_机智兵的博客-CSDN博客
问:实现XA模式和不实现XA模式有什么区别?内容不变只是格式发生了变化??
2.TCC模式 另外一种实现这个功能的方法
理解:
3.saga模式
问:构建一个微服务系统需要安装多少软件啊
问:淘宝 这个功能的实现
问:Seata安装在哪个电脑上?和什么软件组合安装在一起?
DataSourceProxy 解析SQL语义→提取表元信息→获取前置镜像beforemage→执行业务SQL→获取后置对象aftermage→生成undolog信息并缓存→注册分支事务→undo_log
问:生成这个镜像不会很耗费资源么?不会,不需要回滚时,会直接删除
DataSourceProxy 解析SQL语义→提取表元信息→获取前置镜像beforemage→执行业务SQL→获取后置对象aftermage→生成undolog信息并缓存→注册分支事务→undo_log
用前置镜像进行回滚
注册分支事务时增加一个这条数据的全局锁row_key,这样这条数据就不能被其他人修改
111271141
init TM
init RM
TM RM
有个类 GlobalTransactionallinterceptor.java 叫全局事务拦截器
会调用invoke方法
在execute方法中
核心的核心
//2.开启事务
beginTransaction(txInfo,tx);
Object rs =null;
try{
//3.执行业务逻辑
rs = business.execute();
}catch (Throwable ex){
//5.回滚事务
completeTransactionAfterThrowing(txInfo,tx,ex);
throw ex;
}
//4.提交事务
commitTransaction(tx);
return rs;
}finally{
//6.清理缓存信息
triggerAfterCompletion();
cleanUp();
}
问:为啥变量名取XID,不取Gid,hhhhhh
问:为啥函数的功能要分的这么细啊,像这种非常核心的,直接写成一个方法,不就好了,看不透啊
执行业务逻辑
回滚事务
11271301
调用doBranchRegister方法中调用setBranchId方法中调用branchRegister
创建分支事务
行锁收集 List
全局事务添加 全局事务更新 全局事务移除 添加分支事务
返回分支事务ID
commit提交
TransactionTemplate.java
一个接口GlobalTransaction.java 里的方法 commit()
接口GlobalTransaction.java的实现类DefaultGlobalTransaction.java里边重写了commit方法
在这个方法中执行,成功还是失败,都会重试5次
调用TransactionManager的commit方法
syncCall
同一个类 第103行 使用netty发送请求TmNettyRemotingClient
DefaultCoordinator.java类里面的doGlobalCommit
asyncCommit
changeStatus
onStatusChange方法