`
envy2002
  • 浏览: 151671 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

分布式事务

 
阅读更多

                                                        分布式事务

      现在遇到了几个项目,这些项目都有一个共同特点,就是要求分布式事务。能够满足跨系统的保持数据的一致性。举个简单例子,我没钱买房,问老婆借了1万块,到期了,该还给老婆了,那就转账吧。如图:

 

我的银行卡是招商银行的,老婆的银行卡是中国银行的,很显然这就是个分布式事务了,招行要完成的动作是A(我的账号)-10000, 中行的动作时B+10000,两个动作比如同时成功才OK,如图。

上网查了一下,这种分布式事务是有个开放协议的叫x/open,主要采用了两部提交法算法,异构的数据库只要实现了这个协议,就可以完成分布式事务。这个需要底层数据库的支持,因为这个协议和数据库底层实现密切配合,需要各个数据库的厂商自己完成符合xa协议的数据库驱动,即driver.

      很多银行采用Tuxedo中间件来控制分布式事务,其实这个x/open协议就是由 tuxedo的xa协议来的。

       那么这种分布式的事务结构,往往都是借助第三者的,架构图如下:

 

       有意思的是这个x/open协议的实质,是叫做什么两步提交。

第一步叫做预提交。即多个系统事务“几乎”已经全部做好了,各个数据库资源告诉事务管理器--“i am ready",

事务管理器最后一声令下---“提交”,两者真正提交,提交过程中出错,全部回滚。

       如果我们不知道有什么xa协议,两步提交,肯定有人会想,我自己写个中间件来搞个逆向事务不可以吗?这主要涉及到 01,10这两种case, 01表示我A-10000的事务失败,老婆的B+10000成功。那么我先反推导出,老婆的逆事务为B-10000,我的逆事务为A+10000. 那么如果老婆的事务成功,我的失败,很显然,老婆的事务要回退,那么就再执行个逆事务,B-10000.貌似有道理,但是这个逆事务的“推理机”你会做吗?似乎有难度哦。而且有问题的是,如果这个逆事务中途出现失败该如何处理,逆事务的效率如何等等。这都是一堆的问题。

 

        这个分布式事务最大的缺点就是会锁定数据库资源,两步提交消息反反复复,对网络不好的情况,肯定很难有扩展性。于是有人提出了基于消息队列的分布式事务处理。有这篇文章。

http://www.yiihsia.com/2010/11/%E7%94%A8%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E5%92%8C%E6%B6%88%E6%81%AF%E5%BA%94%E7%94%A8%E7%8A%B6%E6%80%81%E8%A1%A8%E6%9D%A5%E6%B6%88%E9%99%A4%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1/

   这篇文章的关键代码就是这段,我看的有些稀里糊涂,说说自己的理解吧。

   

begin;
INSERT INTO transaction VALUES(xid, $seller_id, $buyer_id, $amount);
put_to_queue “update user(“seller”, $seller_id, amount);
put_to_queue “update user(“buyer”, $buyer_id, amount);
commit;
for each message in queue
begin;
SELECT count(*) as cnt FROM message_applied WHERE msg_id = message.id;
if cnt = 0 then
if message.type = “seller” then
UPDATE user SET amt_sold = amt_sold + message.amount WHERE id = message.user_id;
else
UPDATE user SET amt_bought = amt_bought + message.amount WHERE id = message.user_id;
end
INSERT INTO message_applied VALUES(message.id);
end
commit;
if 上述事务成功
dequeue message
DELETE FROM message_applied WHERE msg_id = message.id;
end
end

 

 

 这段代码的场景是 A数据有一个交易的表transaction, B数据有个表User. 要求同时更新 transaction, user表。

    那这段代码的意思是在数据库A上,开始一个事物,插入transaction表,并且把更新数据库B的消息放到了消息队列里。 在另一端的数据库里面,从消息队列里面获取消息,然后开启一个事务,根据消息做动作,然后用另外一个表(message_applied)做了一个log, 表明这个消息已经用过了。然后把消息队列中的消息删除,删除message_appied中的log.

 

      文章最后这样保持了弱一致性。可能看到这里,你和我一样困惑。

      还是上图那4中case:

      00---(A 数据库操作失败,B数据库操作失败)

      01---(A 数据库操作失败,B数据库操作成功)

     10---(A 数据库操作成功,B数据库操作失败)

      11---(A 数据库操作成功,B数据库操作成功)

 

   begin;

INSERT INTO transaction VALUES(xid, $seller_id, $buyer_id, $amount);
put_to_queue “update user(“seller”, $seller_id, amount);
put_to_queue “update user(“buyer”, $buyer_id, amount);
commit;

    这段代码,我觉得应该加一个约束,就是 添加队列也应该在这个事务中,让其保持执行顺序的偏序,就是先插 transaction,然后 put_to_queue。因为有可能如果put_to_queue是个应用程序的话,很可能是先put_to_queue,然后插transaction,这样会导致01这种case出现,那么就会产生不一致性。(放进队列成功,但是插入由于unique的限制失败了)。如果能保证有这个顺序性,那么00,01这种case就不会出现.

那我们大胆假设这个消息队列也是数据库中的一个id自增的表。那么10这种情况会不会出现呢?也不会!根据单个数据库事务一致性。那么最后只剩下11这种case了。

    后面的代码,就是A机器的队列传到B,B根据队列中的数据来执行动作。其实我们分析一下,A和B之间的队列的传输本身就存在不一致风险,断电了怎么办,队列中中数据没了,但是A数据库数据已经提交了,怎么办?所以文章说实现了弱一致性,这里面只不过玩了个风险置换的游戏,如果这种风险发生的概率很高,很显然这是不可取的。

      这段代码的核心思想摈弃(00,01,10这3种case, 只留11z这种case)就是A数据库成功,那么操作数据库B的操作我通过消息队列或者其他备份措施,使其能够正确到达B机器,B机器也能百分之百完成,那么数据就满足一致性! 恰恰,这还是有风险的,我们需要找到一种机制让这种风险不存在,或者无限小。

      谁能告诉我?!其实一段数据从A机器转移到B机器,通过某种协议还是100%做到的!不过这个协议应该有些复杂。所以文章最后说,如果项目时间短,还是用xa协议,分布式事务处理,如果不急,就可以采用消息队列,而且开发这个消息队列还是有些复杂的。

 

      最后,如果不是数据库之间的数据一致,那又改如何处理呢?

      为什么说若一致性呢,因为10这种情况也是能出现的,A数据库提交成功,B提交不成功(由于字段的unique限制等,二步提交法,第一步就会去跑一边事务,如果能跑,就进入第二步,如果不能跑,就通知两机器撤销事务)那么,很显然,我们明显是可以预料B数据库的事务是可以“百分百完成的”。那么这个思想,就是把单机的事务控制,比用利用log, 然后转移log,到B机去执行log,不过这种思想还是有欠缺的。

 

 

 

分享到:
评论
1 楼 lanhaitun1991 2015-09-18  
亲,其实你这里介绍的方法有一个最大的问题:如果放入队列之后,但是commit失败了,怎么办?相当于01的情况。

相关推荐

    java分布式事务demo

    Java分布式事务是大型分布式系统中不可或缺的一个重要组成部分,它确保在多个网络节点间的数据操作能够保持一致性和完整性。在分布式环境中,由于多个服务之间可能存在数据交互,因此需要一种机制来处理跨服务的数据...

    深入理解分布式事务,高并发下分布式事务的解决方案

    本文来自于csdn,本文主要从分布式的原因,事务特性,和解决方案中深入理解了分布式事务,希望对您的学习有所帮助。 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的...

    深入理解分布式事务

    ### 深入理解分布式事务 #### 一、分布式事务定义及重要性 分布式事务是指在分布式系统中,为了确保跨多个节点上的操作能够正确地完成或者全部回滚,所采取的一种事务处理机制。在这样的场景下,事务的参与者、...

    springboot多数据源即分布式事务解决方案

    SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作不同的数据库。本文将详细探讨SpringBoot如何实现多数据源以及分布式事务。 首先,我们要理解什么...

    浅谈分布式事务实现技术及应用场景探讨.pdf

    "浅谈分布式事务实现技术及应用场景探讨" 分布式事务是指在分布式系统中,多个节点之间的数据访问和更新操作集合,需要保证事务的原子性、一致性、隔离性和持久性。随着软件系统支持用户数的不断提高,对其架构的...

    分布式事务若依框架文档

    ### 分布式事务若依框架文档 #### 一、分布式事务基本概念 在理解分布式事务之前,我们首先需要了解数据库事务的基本属性,即ACID特性。 - **原子性(Atomicity)**:事务中的所有操作要么全部成功,要么全部失败...

    微服务架构的分布式事务解决方案(Dubbo分布式事务处理)

    分布式事务是一个绕不过去的挑战!微服务架构本质上就是分布式服务化架构,微服务架构的流行,让分布式事务问题日益突出!尤其是在订单业务、资金业务等系统核心业务流程中,一定要有可靠的分布式事务解决方案来保证...

    java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip

    本项目"java+spring+mybatis+mysql+RuoYi-atomikos-实现分布式事务.zip"是一个基于若依(RuoYi)框架改造的多模块分布式事务解决方案,它利用了Atomikos这一强大的分布式事务管理器。以下将详细解析这个项目的知识点...

    大规模SOA系统中的分布式事务处事

    在大规模的SOA(Service-Oriented Architecture,面向服务架构)系统中,分布式事务处理是一项至关重要的技术。这种架构通常涉及多个独立的服务协同工作,每个服务都可能有自己的数据存储,因此,确保这些服务之间的...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    在IT行业中,分布式事务处理是复杂系统架构中的一个重要环节,特别是在多数据库或服务协同工作的场景下。本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。...

    分布式事务源代码

    分布式事务是一种在分布式系统中处理数据一致性的重要技术。在大型网络应用中,数据往往分散在多个数据库或服务器上,为了保证这些数据的一致性,就需要使用分布式事务来协调跨多个节点的操作。本资料包“分布式事务...

    基于Java的分布式事务解决方案myth设计源码

    该项目是一个采用消息队列解决分布式事务的开源框架,基于Java语言开发(JDK1.8),并支持dubbo、springcloud、motan等RPC框架进行分布式事务处理。通过该项目,开发者可以学习并实践分布式事务的处理,为后续的...

    若依框架分布式事务配置和项目启动手册

    《若依框架分布式事务配置与项目启动指南》 在当今的互联网时代,高并发、大数据量的业务场景对系统的性能和稳定性提出了更高要求,而分布式事务则是解决这些问题的关键技术之一。若依框架作为一款广受欢迎的Java...

    ejb3.0 分布式事务

    【ejb3.0 分布式事务详解】 在企业级Java应用中,EJB(Enterprise JavaBeans)3.0提供了一种强大而灵活的方式来处理分布式事务。分布式事务是指跨越多个数据库或资源管理器的单一逻辑操作,确保了数据的一致性和...

    分布式事务与Seata.pptx

    分布式事务与Seata 分布式事务是指在分布式系统中跨多个资源或服务进行的交易操作,需要保证操作的原子性、一致性、隔离性和持久性。分布式事务的解决方案包括Seata、TCC、SAGA、X/Open XA等。 分布式事务的产生是...

    分布式事务.pdf

    分布式事务是为了解决分布式系统中跨越多个节点的操作,要求这些操作要么全部成功要么全部失败的一种事务机制。它是为了保证在不同节点上的数据一致性而产生的概念。分布式事务广泛应用于微服务架构、数据库分库分表...

    微服务架构的分布式事务控制及解决方案视频教程

    最全分布式事务视频课程详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 视频课程大纲: 1.事务基本概念讲解(本地、分布式) 2.分布式事务理论(CAP、BASE) 3.分布式事务解决方案之2PC(xa、...

Global site tag (gtag.js) - Google Analytics