分布式事务没有标准答案,只有结合业务场景的解决方案
TCC,XA,JTA,LCN,2PC
1、分布式事务是什么
数据库分库分表之后,保证多个数据库之间的提交和回滚数据的一致性 ,如图,假设一个订单系统,订单数据库和调度数据库是分开的,如何保证订单库和调度库的一致性,就是所谓分布式事务,这里多说一句,单一数据库不存在分布式事务的问题。
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实现,那么就不能跨系统调用,只能是单一系统进行多个数据库的操作
看一下代码中如何使用
此处的数据库连接池,采用了阿里的druid连接池
事务管理交由atomikos进行管理,具体的代码其实百度查有很多例程,此处就不多说了,厂商封装好了atomikos,不仅仅是要求Java实现,还要求数据库支持才行(mysql,oracle,db2)(undo,redo日志),此处我们画一个图来说明一下atomikos的实现原理
第一阶段,准备阶段
第二阶段:提交阶段
优点:数据一致性好
缺点:性能比较低,需要保证两个数据库同时在连接数据库,占用很大的资源。一旦协调员挂掉了,无法进行恢复或者回滚。
互联网项目用这种方法并不多,实在太消耗资源了,占用太多的数据库的链接资源,因为只能是单一系统的应用,限制性很大,分布式事务,更多是应用之间的问题,对此,atomikos提出了一个TCC的解决方案,应用与应用之间的分布式事务
TCC就是Atomikos发出的一篇论文(编程式的分布式事务,需要我们自己写代码来实现)
Java应用提供这三个操作接口(通过http/rest方式提供):Try 尝试、Confirm 确认、Concel 取消
每一个都是通过HTTP来实现的,并且中间并不是通过数据库进行回滚数据,而是根据自己的代码进行实现,只需要保证BASE原则就可以,保证最终一致性就可以进行,其实TCC就是一种两阶段提交思想的自己编码实现
就好像是ACID原则那样,参考http://drupalchina.cn/node/1401这边文章
3、MQ(消息队列)
消息队列实现分布式事务的思路:
(1)数据一定要投递到MQ(消息队列本身提供确认机制activemq\rabbitmq,rocketmq,kafka...)
(2)消息消费的确认机制,消息一定要被正确消费(消息队列ack机制)
(3)保障消费处理的幂等性,根据业务逻辑去实现(处理一条消息,就需要保留一条记录,单独一个记录表 )
4、LCN
开源框架,可以直接到GitHub中学习,目前应用公司不算多