• 什么是分布式事物


    事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉。就要么生,要么死。没有半死不死的中间不可预期状态。

    参考下薛定谔的猫。

    事务是为了保障业务数据的完整性和准确性的。
     
    分布式事务,常见的两个处理办法就是两段式提交和补偿。
    两段式提交典型的就是XA,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了。
    补偿比较好理解,先处理业务,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状态到某个结束状态(一般是失败状态),然后就世界太平了。典型的就是冲正操作。
     
    准备好了以后,如果没有问题,收到提交,所有人都开始提交。
    这个时候,比如对数据库来说,有redo日志的。
    如果某个数据库这时候宕机了,那么它重启的时候,先执行检查,也会把上一次的这些操作都提交掉的。所以各个点的数据都是一致的。
     
    问题 1:比如 一个业务要调用很多的服务都是写操作,如果有其中一个写的服务失败了,怎么办 ?假设 4个写的吧,有2个写失败了 。

    kimmking:淘宝之类的网站一般的做法是,如果4个都成功才算成功,那么这次提交时4个写都设置成一个中间状态,先容许不一致。然后4个执行完成了以后,回调或是定时任务里检查这4个数据是不是一致的,如果一致就全部置为成功状态,如果不一致就全部置为失败。
     
    复杂的业务交互过程中,不建议使用强一致性的分布式事务。解决分布式事务的最好办法就是不考虑分布式事务。就像刚说的问题一样,把分布式的事务过程拆解成多个中间状态,中间状态的东西不允许用户直接操作,等状态都一致成功,或者检测到不一致的时候全部失败掉。就解耦了这个强一致性的过程。
     
    一般情况下准实时就成了。涉及到钱,有时候也可以这么搞。
    淘宝几s内完整一个订单处理,不是什么问题吧。
    银行也不是全部都强一致性。也会扎差,也会冲正。
    特别是涉及到多个系统的时候,我们比如买机票,支付完成以后,只支付完成状态,然后返回给用户了,我们过几分钟再刷新页面,才会看到变成已出票,订单完成状态。
    这个时候,如果我们要求所有处理,都是强一致性的,那么久完蛋了。页面要死在那儿几分钟,才把这个事务处理完成,返回给用户。
     
    这样就肯定涉及一个问题,支付了,但是最终出票没出来。那就没办法,商量换票或退款。
    淘宝的订单改成出票失败,给支付发消息通知退款。
    慢的时候,有可能是手工出票,这时出一张票半小时都可能,如果要求都必须强一致性的话,所有处理线程都挂在哪儿,系统早就完蛋了。
     
    解决分布式事务的最好办法就是不考虑分布式事务。
    拆分,大的业务流程,转化成几个小的业务流程,然后考虑最终一致性。
     
  • 相关阅读:
    遗传基因有多大?
    【Unity3D】【NGUI】怎样动态给EventDelegate加入參数
    怎样通过Java程序提交yarn的mapreduce计算任务
    Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)
    java多线程----拒绝策略
    java多线程-----volatile
    java多线程----JUC集合”01之 框架
    java多线程----Semaphore信号量
    java多线程---CyclicBarrier
    java多线程----CountDownLatch
  • 原文地址:https://www.cnblogs.com/zourui4271/p/4871062.html
Copyright © 2020-2023  润新知