分布式事务
- 1.网络波动两个节点数据不一致,网络好了之后,最后怎么同步两个节点的数据。
- 2.分布式系统有三个指标:
- 3.实际情况下分区一定会发生。
- 4.BASE理论是对CAP的一种解决思路,包含三个思想:
- 5.seata也是一个微服务。需要注册到nacos中。
- 6.我们知道注册到Nacos中的微服务,确定一个具体实例需要四个信息:
- 7.Seata的架构
- 8.四种不同的分布式事务解决方案:
- 9.XA是规范,目前主流数据库都实现了这种规范,实现的原理基于两阶段提交。
- 10.XA的优缺点
- 11.实现XA模式步骤:
- 12.AT模式:
- 13.AT脏写问题:
- 14.记录更新前后快照的作用:
- 15.全局锁的作用:避免出现脏写,而且其他事务可以查询,提高效率。
- 16.全局锁和DB锁是会出现死锁现象的。
- 17.实现AT:
- 18.AT模式的优缺点
- 19.TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:
- 20.TCC模式优缺点:
- 21.cancel要是崩了咋办
- 22.幂等性就是:网络波动时会发送多次重试的请求。比如我买一件商品
- 23.幂等性:新增和修改时需要考虑幂等性,查询和删除不需要考虑幂等性。
- 24.幂等性、业务悬挂和空回滚:是如何解决的?
- 25.计算机网络传输协议:
- 26.TTC的注解:
- 27.Saga模式:是SEATA提供的长事务解决方案。也分为两个阶段:
- 28.跨公司跨平台用SAGA模式。
- 29.Saga模式优点:
- 30.AX模式:可以设置读已提交和读未提交。
- 31.http重试机制,会不会导致业务悬挂问题。
- 32xid是从哪里来的呀?
- 33.tCC和AT可以组合使用。
- 34.四种模式对比
- 35.网络波动导致脑裂,形成两个节点群,两个主节点修改同一行数据,网络好了之后,这同一行的数据会冲突。这个冲突的数据是按照那个节点群去同步,还是会直接报错啊。???
1.网络波动两个节点数据不一致,网络好了之后,最后怎么同步两个节点的数据。
他是自动配置好的。节点之间会互相通信。不需要太关注细节。
2.分布式系统有三个指标:
- Consistency(一致性)
- Availability(可用性)
- Partition tolerance (分区容错性)
在P一定会出现的情况下,A和C之间只能实现一个
3.实际情况下分区一定会发生。
在集群出现分区时,整个系统也要持续对外提供服务
4.BASE理论是对CAP的一种解决思路,包含三个思想:
- Basically Available (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
- **Soft State(软状态):**在一定时间内,允许出现中间状态,比如临时的不一致状态。
- Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。
5.seata也是一个微服务。需要注册到nacos中。
要跟seata通信的话,得用事务来建立连接。所以要配置一下seata。
6.我们知道注册到Nacos中的微服务,确定一个具体实例需要四个信息:
- namespace:命名空间
- group:分组
- application:服务名
- cluster:集群名
7.Seata的架构
Seata事务管理中有三个重要的角色:
- TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。
- TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - **资源管理器:**管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
8.四种不同的分布式事务解决方案:
- XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
- AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
- TCC模式:最终一致的分阶段事务模式,有业务侵入
- SAGA模式:长事务模式,有业务侵入
无论哪种方案,都离不开TC,也就是事务的协调者。
9.XA是规范,目前主流数据库都实现了这种规范,实现的原理基于两阶段提交。
子事务执行sql,通知TM执行成功,然后TM统一通知各子事务提交操作,或回滚。
RM一阶段的工作:
① 注册分支事务到TC
② 执行分支业务sql但不提交
③ 报告执行状态到TC
TC二阶段的工作:
-
TC检测各分支事务执行状态
a.如果都成功,通知所有RM提交事务
b.如果有失败,通知所有RM回滚事务
RM二阶段的工作:
- 接收TC指令,提交或回滚事务
10.XA的优缺点
XA模式的优点是什么?
- 事务的强一致性,满足ACID原则。
- 常用数据库都支持,实现简单,并且没有代码侵入
XA模式的缺点是什么?
- 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
- 依赖关系型数据库实现事务
注意:XA模式无侵入:事务入口方法下的其他微服务不需要添加任何代码。
单表不需要开启事务。多表需要开启本地事务。
11.实现XA模式步骤:
1)修改application.yml文件(每个参与事务的微服务),开启XA模式:
seata:
data-source-proxy-mode: XA
2)给发起全局事务的入口方法添加@GlobalTransactional注解。
12.AT模式:
阶段一RM的工作:
- 注册分支事务
- 记录undo-log(数据快照)
- 执行业务sql并提交
- 报告事务状态
阶段二提交时RM的工作:
- 删除undo-log即可
阶段二回滚时RM的工作:
- 根据undo-log恢复数据到更新前
13.AT脏写问题:
在多线程并发访问AT模式的分布式事务时,有可能出现脏写问题
解决思路就是引入了全局锁的概念。在释放DB锁之前,先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据。
14.记录更新前后快照的作用:
更新之前快照是用来回滚的。
更新之后的快照。为了回滚时,对比数据,是否被其他事务操作过。
如果对比不一样,会报错记录到日志里,然后让开发人员来维护数据。
15.全局锁的作用:避免出现脏写,而且其他事务可以查询,提高效率。
有全局锁的话,在锁被占用的时间内,其他事务可以查询,但不可以增删改操作。
如果想操作得等待锁的释放,默认重试30次,每次10毫秒。
注意:必须都得用统一的seate框架。才可以用全局锁。
16.全局锁和DB锁是会出现死锁现象的。
全局锁和DB锁,两个事务分别持有,而且互相等待会出现死锁。
但是会有过期时间限时。所以不会出现长时间的死锁问题。
17.实现AT:
1)AT模式需要一个表来记录全局锁(有内部记录)、另一张表来记录数据快照undo_log(需要自己手动添加到数据库中)。
2)将事务模式修改为AT模式。
seata:
data-source-proxy-mode: AT # 默认就是AT
3)给发起全局事务的入口方法添加@GlobalTransactional注解:
18.AT模式的优缺点
AT模式的优点:
- 一阶段完成直接提交事务,释放数据库资源,性能比较好
- 利用全局锁实现读写隔离
- 没有代码侵入,框架自动完成回滚和提交
AT模式的缺点:
- 两阶段之间属于软状态,属于最终一致
- 框架的快照功能会影响性能,但比XA模式要好很多
19.TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:
- Try:资源的检测和预留;
- Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。
- Cancel:预留资源释放,可以理解为try的反向操作。
20.TCC模式优缺点:
TCC模式的每个阶段是做什么的?
- Try:资源检查和预留
- Confirm:业务执行和提交
- Cancel:预留资源的释放
TCC的优点是什么?
- 一阶段完成直接提交事务,释放数据库资源,性能好
- 相比AT模型,无需生成快照,无需使用全局锁,性能最强
- 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库
TCC的缺点是什么?
- 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
- 软状态,事务是最终一致
- 需要考虑Confirm和Cancel的失败情况,做好幂等处理
21.cancel要是崩了咋办
返回false,TC会再次通知执行cancel的。
22.幂等性就是:网络波动时会发送多次重试的请求。比如我买一件商品
结果网络波动,发了两次重试,那意思就变成了买两次商品了,可不能库存和账号余额扣两次呀。
23.幂等性:新增和修改时需要考虑幂等性,查询和删除不需要考虑幂等性。
24.幂等性、业务悬挂和空回滚:是如何解决的?
设计一张:记录当前事务id和执行状态的表。
25.计算机网络传输协议:
可靠传输协议:TCP
不可靠传输协议:UDP
23.事务技术如何选型
1)XA和钱有关的,保证强一致性。
2)AT负责关系型数据库
3)TCC负责非关系型数据库。
26.TTC的注解:
@TwoPhaseBusinessAction 定义 try confirm cancel 方法名
//把参数保存到上下文对象中。
@BusinessActionContextParameter
//上下文对象可以获取参数的注解,是一个map集合。
BusinessActionContext
@LocalTCC
public interface AccountTCCService {
/**
* 一阶段:try 预留
* @TwoPhaseBusinessAction 定义 try confirm cancel 方法名
*/
@TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")
void deduct(@BusinessActionContextParameter(paramName = "userId") Integer userId,
@BusinessActionContextParameter(paramName = "money") Integer money);
/**
* 二阶段:confirm 提交
* @param ctx 可以获得 @BusinessActionContextParameter参数和xid
* @return
*/
boolean confirm(BusinessActionContext ctx);
/**
* 二阶段:cancel 回滚
* @param ctx 可以获得 @BusinessActionContextParameter参数和xid
* @return
*/
boolean cancel(BusinessActionContext ctx);
}
27.Saga模式:是SEATA提供的长事务解决方案。也分为两个阶段:
- 一阶段:直接提交本地事务(不做冻结、不做快照)
- 二阶段:成功则什么都不做;失败则通过编写补偿业务来回滚
28.跨公司跨平台用SAGA模式。
事务回滚时间比较长,所以SAGA跨银行转账不是秒到账的
29.Saga模式优点:
- 事务参与者可以基于事件驱动实现异步调用,吞吐高
- 一阶段直接提交事务,无锁,性能好
- 不用编写TCC中的三个阶段,实现简单
缺点:
- 软状态持续时间不确定,时效性差
- 没有锁,没有事务隔离,会有脏写
30.AX模式:可以设置读已提交和读未提交。
31.http重试机制,会不会导致业务悬挂问题。
不会,超时才会出现重试,但是一超时的话,就会导致事务直接空回滚,所以肯定不会出现悬挂的问题。
32xid是从哪里来的呀?
开启全局事务时,会被新建xid
feign调用时,从请求header中获取远程调用xid