分布式事务的前世今生


一.什么是事务

         事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程       序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用       形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end             transaction)之间执行的全体操作组成。

     (1)事务的四大特性

        原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

        一致性:事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性(实例:转账,两个账户余额相加,值不变。)

        隔离型:多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。

        持久性:指一个事务一旦被提交,他对数据库的影响是永久性的。

    (2)事务的隔离级别

          脏读:就是一个事务可以读取另一个未提交事务的数据。

          不可重复读:就是一个事务要等另一个事务提交后才能读取数据。一个事务内多次读取数据,但是两次读取之间有另一个事务执行更新操作,导致同一个事务能两次读取的数据不一致。

          幻读取:有两个事务A,B;A事务先对表的数据批量更新操作,B事务对表的插入操作,A在表进行查询操作操作,结果出现了未更新完成的数据。像出现了幻觉一样

        Read uncommitted:读未提交。会出现脏读,不可重复读,幻读。

        Read committed:读提交。会出现不可重复读,幻读。

        Repeatable read :可重复读。会出现幻读。

        Serializable :数据库被设计为单线程。可以避免以上所有问题

二.什么是分布式事务
     简单点说,分布式事务用于在分布式系统中保证不同节点之间的数据一致。

三.为什么要使用分布式事务
     场景:随着互联网发展,大多数互联网公司会将系统进行服务拆分,系统服务化变得越来越流行,客户进行下单操作,客户进行支付,并在订单系统下单成功生成订单,但是需要在行库存服务扣减库存操作,若库存扣减发生异常,如何保证两个系统服务之间的数据一致性?所以分布式事务的使用迫在眉睫

四.分布式事务的理论知识

   (1)CAP 理论
        C:一致性(Consistency)客户端知道一些了的操作都会同时生效。

        A:可用性(Availability)每个操作都必须以可预期的结果相应结束。

        P:分区容错性(Partition tolerance)即使出现单个组件无法可用,操作依然可以完成。

        cap三者一般很难全部实现,一般会三个中选择两个,cp或者是ap,但是在般互联网公司中一般会牺牲强一致性换取弱一致性,换取高可用性(AP)

xa(全局事务-强一致性)

   (2)BASE理论

       对cap的一致性和可用性权衡的。核心思想是即使无法做到强一致性,但是每个应用到可以根据自身业务特点,采用适当的方式来使系统最终一致性。

      BA:基本可用,在不可抗力的情况下,仍然能够保证‘可用性’,即使一定时间内仍然能够返回一个明确的结果(基本可用和高可用的区别)。
     S 柔性状态 同一数据的不同副本状态,可以不需要实时一致。

     E 最终一致同一数据的不同副本状态,可以不需要实时一致,但是一定要保证经过一定时间后仍然是一致的。

     酸碱平衡

     ACID 是酸, Base是碱, 开发场景中对ACID和Base取舍是酸碱平衡

   (3)二段式提交(2PC)与三段式(3PC)提交概念

   五.分布式事务的实现方式

   (1) xa协议

      全局事务-强一致性

   (2) mq消息的可靠性投递(入下图所示)

      

   (3)2pc 的TCC 的方式实现分布式事务(具体代码示例后期会补充并发布到github)
    tcc方式实现分布式事务(try 阶段成功,confirm默认是成功)

   try阶段

confirm阶段

cancel阶段

       

      tcc源码框架地址 https://github.com/changmingxie/tcc-transaction

       easyTransaction源码框架地址 https://github.com/QNJR-GROUP/EasyTransaction

       hmily分布式事务框架地址:https://github.com/Dromara/hmily         

   (4)全局一致性

     在服务器层面实现,比如通过使用阿里云,腾讯云来实现全局一致性

    

猜你喜欢

转载自blog.csdn.net/aazhzhu/article/details/100344555