zoukankan      html  css  js  c++  java
  • 分布式事务解决方案

    1、什么是分布式事务

         通俗讲一个大操作由不同的小操作组成,这些小操作分布在不同服务器上,并且属于不同的应用,分布式事务需要保证这些操作要目全部成功,要么全部失败,本质上将:分布式保证不同数据库的数据一致性。

    2、分布式事务产生的原因

      2.1 数据分库分表

        当数据库单表一年产生的数据超过1000w 那么就需要考虑分库分表,简单的将就是讲原来的一个数据库变成多个数据库,这时候如果一个操作即访问1数据库,又访问2数据库,而且要保证数据的一致性,那么就要用到分布式事务。

         

       2.2应用soa化

        所谓应用soa化就是业务的服务化,如果原来单机支撑整个电商网络,现在对整个网络进行拆解,分离出订单中心,用户中心,库存中心,对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会专门的数据库存储信息,这时候如果要同时对订单和库存进行操作,那么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。

    3、事务的4个特性(ACID)

       原子性   一致性   隔离性  持久性

    4、分布式事务的应用场景

      4.1 支付

        一笔支付,是对买家账户进行扣款,同时对卖家账户进行加钱,这些操作必须在一个事务里面执行,而对于买家账户属于买家中心,对应的买家数据库,而卖家账户属于卖家中心,对应卖家数据库,对不同数据库操作必须引入分布式事务

    4.2  在线下单

        买家在电商平台下单,往往会涉及到两个动作,一个扣库存,第二个是更新订单状态,库存和订单一般属于不同的数据库,需要使用分布式事务保证数据一致性。

    5、常见的分布式事务解决方案

       5.1 消息事务+最终一致性

         所谓消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用。他是将本地事务和发送消息放在了一个分布式事务里,保证要么本地操作成功并且对外发送消息成功,要么两者都失败。开源RocketMq就支持这一特性。原理如下:

    1.A系统向消息中间件发送一条预备消息

    2.消息中间件保存预备消息并返回成功

    3.A执行本地事务

    4.A发送提交消息给消息中间件

    通过以上4步完成了一个消息事务,对于以上4个步骤,每个步骤都有可能产生错误:

       步骤一出错,则整个事务失败,不会执行A的本地操作

       步骤二出错,则整个事务失败,不会执行A的本地操作

       步骤三出错,这时需要回滚预备消息消息如何回滚那?答案是A系统实现一个消息中间件的回调接口,消息中间件会不断执行回调接口,检查A事务执行是否成功,如果失败则回滚预备消息

       步骤四出错,这时候A的本地事务执行是否成功,那么消息中间件是否需要消息回滚?不需要,其实通过回调接口,消息中间件能够检测到A执行成功了,这时候其实不需要A发送提交消息了,消息中间件可以自己对消息进行提交,从而完成整个消息事务。

    基于消息中间件的两个阶段提高往往用在高并发场景下,将一个分布式事务拆分成一个消息事务(A系统的本地操作+发送消息)+B系统本地操作,其中B系统的操作由消息驱动,只要消息事务成功,那么A操作一定成功,消息一定发送出来了,这时候B会受到消息去执行本地操作。如果本地操作失败。消息会重投,知道B操作成功,这样就变相的实现了A与B的分布式事务。

    虽然上面的方案能完成A和B的操作,但是A和B并不是严格的一致的,我们牺牲了一致性,来换来的性能的提升,当然这种做法是有风险的,如果B一直执行不成功,那么一一致性会被破坏,具体要不要还要看看业务能够承担的风险。

    5.2 基于XA协议的两阶段提交

    5.3 TCC编程模式

        

  • 相关阅读:
    《C和指针》读书笔记——第一章 快速上手
    《C和指针》读书笔记——第三章 数据
    Linux下简易蜂鸣器驱动代码及测试实例
    Linux下GPIO驱动(五) misc_register();
    Linux下实现流水灯等功能的LED驱动代码及测试实例
    Linux下GPIO驱动(四) gpio_request();gpio_free();
    支持阻塞操作和轮询操作的globalfifo设备驱动代码分析以及测试代码
    基于等待队列及poll机制的按键驱动代码分析和测试代码
    Linux下GPIO驱动(一) 一个简单的LED驱动
    虚拟内存设备驱动memdev及实例代码
  • 原文地址:https://www.cnblogs.com/lwdmaib/p/9337085.html
Copyright © 2011-2022 走看看