一,分布式事务阐述
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用,分布式事务需要保证这些操作要么全部成功,要么全部失败。
事务的本质就是保证不同数据库的数据一致性。
二,分布式事务通用解决方案
1,两阶段提交(2PC)
通过引入一个协调者来进行协调事务的参与者并且最终决定是否执行或回滚
(1) 准备阶段
事务参与者执行但不提交 ,协调者询问参与者是否成功,参与者发送结果
(2)提交阶段
协调者根据参与者返回的结果来判断是否进行回滚
2.存在缺陷
1.同步行为 效率较低 参与者在等待其他参与者返回结果期间处于阻塞状态
2.容错低 任何一个节点失败都导致回滚
3.数据不一致 协调者发送提交命令时可能网络异常导致部分参与者提交
4.协调者不能发生故障
2.补偿事务(TCC)
补偿机制,核心思想是对每一个操作都注册一个对应的确认和补偿操作
分为三个阶段
Try 对业务系统进行检测并预留资源
Confirm 阶段是对try阶段的确认 所以默认是try成功 confirm一定成功
Cancel 是在业务执行错误的业务取消预留资源释放
缺点:
确认和取消阶段都可能失败并且需要编写大量补偿代码
3本地消息表+异步确认
消息表与业务数据表存在于同一数据库中,并且使用消息队列来保证数据一致性
1.进行业务数据操作同时向消息表中插入一条数据,然后将本地消息表中的数据发送给消息队列,转发成功则删除,否则继续转发,另一方监听消息队列,获取消息后进行消息中的操作
缺点: 必须保证插入消息表成功 ,耦合性高
4.mq事务消息
使用支持事务的消息队列来进行
缺点:实现难度大,大部分消息队列并不支持 rocketmq事务部分代码并未开源
三.开源成熟的分布式组件
1.seata(阿里开源的分布式事务解决方案)
1.Seata的名词
2.Seata的四种模式
(1)AT模式(默认也是应用最广泛的模式)
AT模式也是两阶段提交的模式,最大的优点是无侵入
一阶段下解析sql,并保存该条数据为快照,执行sql并生成快照再将该条数据行锁
二阶段如果是提交就清楚存储的快照和行锁 如果是回滚则使用快照校验数据避免脏写后再回滚
(2)XA模式
Xa模式分为2pc和3pc两种实现方式
.两阶段
原理同上面方案一样
三阶段
原理在二阶段基础上进行了增强,将二阶段进行了拆分
阶段一:Cancommit
协调者询问参与者是否可以进行操作
阶段二:precommit
协调者向参与者发起预提交(执行事务但不提交)请求,并等待参与者进行ack返回
如果没有全部返回或某个协调者超时则返回about
阶段三:docommit
协调者向参与者发起提交事务请求并等待ack返回
区别
2pc只有协调者有超时时间 3pc都有
注:Seata的xa模式为了保障强一致性会加锁影响效率,所以使用不多
(2) TCC模式
Tcc理论见上面
Seata的tcc 比需要注意的是空回滚和防悬挂,幂等性等问题
空回滚:没有进行第一阶段而执行了第二阶段,则取消操作是无效的
防悬挂:就是预留一些资源但后续某些原因或是达到某种状态预留资源在结束并未释放导致浪费
(4)SAGA
它是一个长事务的解决方案,在saga模式中,每个流程都提交本地事务,当某一个失败则采用补偿机制补偿前面成功的事务
(5)应用场景
- AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。
- TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。
- Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
- XA模式是分布式强一致性的解决方案,但性能低而使用较少。
2. ShardingSphere (开源的分布式数据库中间件解决方案组成的生态圈)
https://shardingsphere.apache.org/document/current/cn/overview/(官网)
由三部分组成
3. tcc-transaction (github开源项目)
按照tcc补偿机制开发的开源项目,自行查看学习
http://mengyun.org/zh-cn/docs/tutorial/quickstart.html (tcc-transaction官网)
https://github.com/changmingxie/tcc-transaction(官方git)
标签:事务,协调者,模式,了解,阶段,解决,参与者,分布式 From: https://www.cnblogs.com/xgphpstudy/p/17571249.html