分布式事务相关问题

简介: 分布式事务没有标准答案,只有结合业务场景的解决方案TCC,XA,JTA,LCN,2PC1、分布式事务是什么    数据库分库分表之后,保证多个数据库之间的提交和回滚数据的一致性 ,如图,假设一个订单系统,订单数据库和调度数据库是分开的,如何保证订单库和调度库的一致性,就是所谓分布式事务,这里多说一句,单一数据库不存在分布式事务的问题。

分布式事务没有标准答案,只有结合业务场景的解决方案

TCC,XA,JTA,LCN,2PC

1、分布式事务是什么

    数据库分库分表之后,保证多个数据库之间的提交和回滚数据的一致性 ,如图,假设一个订单系统,订单数据库和调度数据库是分开的,如何保证订单库和调度库的一致性,就是所谓分布式事务,这里多说一句,单一数据库不存在分布式事务的问题。

img_c079aa1416b23266201d545ca51bc2a2.png

2、常用的分布式事务解决方案第一类:XA,JTA,TCC,2PC,这些都是基于两阶段提交的思想

    (1)、异步任务,校验数据,对比数据是否正确,通知工作人员,也可以根据代码进行修正是数据(最好实现的方法,但并不是分布式事务的解决方案)

    (2)、XA只是一个约定协议,不是一个实现,定义了一个协议,两阶段提交的一个协议2PC,实现是其他开源软件的事情(Java,PHP,go,数据库),JTA就是Java中实现分布式事务的一组规范

    x/openXA 包含了2PC规范 -> Java阵营根据XA协议,定义了JTA规范 -> Atomikos框架进行实现

    Java中常用Atomikos在实现,适用场景:一个Java应用实例,操作多个数据库,针对于单体应用,不能用于跨系统之间的协调,如图所示,还是外卖订单的图,如果通过JTA实现,那么就不能跨系统调用,只能是单一系统进行多个数据库的操作

img_ef0a6c3a231f89e00d8f9683665f49f6.png

    看一下代码中如何使用

img_2e5de39c544b1276a79e2ffbf420467d.png

    此处的数据库连接池,采用了阿里的druid连接池

img_50dfa14873d43adc193adeb61bf72c16.png

    事务管理交由atomikos进行管理,具体的代码其实百度查有很多例程,此处就不多说了,厂商封装好了atomikos,不仅仅是要求Java实现,还要求数据库支持才行(mysql,oracle,db2)(undo,redo日志),此处我们画一个图来说明一下atomikos的实现原理

第一阶段,准备阶段

img_2d4ecd8fd87a74fa2b07312a29e38e2f.png

第二阶段:提交阶段

img_f9b4633479e41aaf5b3a37488b162722.png

    优点:数据一致性好

    缺点:性能比较低,需要保证两个数据库同时在连接数据库,占用很大的资源。一旦协调员挂掉了,无法进行恢复或者回滚。

    互联网项目用这种方法并不多,实在太消耗资源了,占用太多的数据库的链接资源,因为只能是单一系统的应用,限制性很大,分布式事务,更多是应用之间的问题,对此,atomikos提出了一个TCC的解决方案,应用与应用之间的分布式事务

    TCC就是Atomikos发出的一篇论文(编程式的分布式事务,需要我们自己写代码来实现)

    Java应用提供这三个操作接口(通过http/rest方式提供):Try 尝试、Confirm 确认、Concel 取消

img_58e4b196c2b65e3ddc64ddaeb823b7e5.png

    每一个都是通过HTTP来实现的,并且中间并不是通过数据库进行回滚数据,而是根据自己的代码进行实现,只需要保证BASE原则就可以,保证最终一致性就可以进行,其实TCC就是一种两阶段提交思想的自己编码实现

    就好像是ACID原则那样,参考http://drupalchina.cn/node/1401这边文章

3、MQ(消息队列)

    消息队列实现分布式事务的思路: 

    (1)数据一定要投递到MQ(消息队列本身提供确认机制activemq\rabbitmq,rocketmq,kafka...)

    (2)消息消费的确认机制,消息一定要被正确消费(消息队列ack机制)

    (3)保障消费处理的幂等性,根据业务逻辑去实现(处理一条消息,就需要保留一条记录,单独一个记录表 )

img_805ab73fcfbea1990b7ec35c0ceea0a1.png

4、LCN

    开源框架,可以直接到GitHub中学习,目前应用公司不算多

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
消息中间件 Oracle 关系型数据库
分布式事务
分布式事务
103 0
|
6月前
|
SQL 存储 监控
浅谈分布式事务
浅谈分布式事务
31 0
|
9月前
|
存储 算法 网络协议
一文了解分布式事务
一文了解分布式事务
|
10月前
|
程序员
分布式事务 TCC
TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,也是一种补偿式的分布式事务。它通过在业务逻辑中嵌入Try-Confirm-Cancel三个阶段的逻辑,来保证分布式事务的一致性和可靠性。TCC协议的核心思想是“补偿机制”,即在分布式事务出现异常或失败时,通过执行相反的操作来补偿之前的操作,从而达到事务的一致性。
313 0
|
消息中间件 SQL 存储
19、分布式事务
分布式事务
93 0
19、分布式事务
|
消息中间件 存储 Oracle
浅析分布式事务
分布式事务的概念讲解以及常用解决方案
133 0
浅析分布式事务
|
消息中间件 SQL 存储
分布式事务是什么?
分布式事务是什么?
111 0
分布式事务是什么?
|
数据库 微服务
什么是 TCC分布式事务?
什么是 TCC分布式事务?
什么是 TCC分布式事务?
|
消息中间件 架构师 NoSQL
一文解决分布式事务
一文解决分布式事务
245 0
一文解决分布式事务