首先得知道二个概念:
1、CAP理论
CAP是指在分布式系统下,系统包含C、A、P三个要素,并且三者不可兼得。
C: 一致性:同一个数据在同一时刻是相同的
A: 可用性:即系统出错误,但在一定时间范围内仍能够正确的响应用户请求
P: 分区容错性:即某节点或网络分区故障时,系统仍能够提供满足一致性和可用性的服务。
三者只能是CP(强一致性)或者AP(高可用性)
其中, XA就是CP的类型,也就是强一致性,而AT就是AP的类型,也就是最终一致性,中间状态可能会不一样。
2、Seata 的核心组件:
事务协调器(TC):可以理解为 开启/关闭全局锁 和 发送提交/回滚指令 的工具;
事务管理器(TM):负责全局事务的提交或回滚;
资源管理器(RM):接受TC的命令,负责本地事物的提交或回滚;
下面通过举例简述XA和AT的实现原理:
假如有一个字段 num=100,a, b两个事务,都在执行update num=num-10的操作。
XA的简单实现:
- 首先把a, b的事务状态设置为prepare,并且获取全局锁;
- a执行本地事务num=num-10之后,此时num=90;
- b执行本地事务num=num-10以后,此时num=80;
- 事务协调器TC发送指令给事务管理器TM将全局事务提交;
- TM收到提交全局事务的指令,就让a,b一起提交本地事务;
- 直到两个事务都提交完成之后,才释放全局锁。
也就是完全同步的思想,两个都完成了才一起提交,完成之前,a,b操作的相关数据动弹不得,效率非常之低!
AT的简单实现:
- 首先a先执行本地事务,num=num-10;
- 在a提交本地事务之前,会拿到全局锁,这个全局锁就是当前num的值,也就是90,a拿到全局锁之后提交本地事务;
- 然后b开始执行本地事务num=num-10;
- b在提交本地事务之前,也会去拿全局锁,因为此时全局锁的值是90,假如b拿到的不是90,他就会一直cas重试,直至回滚。假如b拿到的是90,那就直接提交b的本地事务即可;
- 最后因为b是最后一个本地事务,提交成功后释放全局锁。
那为什么b拿到的可能不是90:因为a的本地事务已经提交了,所以在b本地事务提交之前,a的值可能会被a的本地事务改变。(也就是脏读)
那他效率为什么比XA快:因为XA是在一开始就锁定所有资源,直至所有本地事务成功,才一起提交,而at只是在提交之前获取全局锁,如果值是正常的没一点关系,直接过,不影响你a操作,如果不是正常的,才会自旋阻塞!当然这只是两个事务,假如a,b,c,d,e五个事务,那我此时a,b,c,d,e执行完后就可以直接提交自己的本地事务,不会影响其它四个事务,只有正在修改的数据被别人修改以后才会阻塞!而XA直接是五个事务动弹不得!
应该是非常的通俗易懂,有疑问的可以在评论区留言!!!
ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!
链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》
标签:事务,Seata,本地,XA,num,提交,全局,分布式 From: https://blog.csdn.net/qq_53281187/article/details/136639654