微服务架构下的分布式事务基础入门( 二 )

  • Serializable 序列化
  • 该级别要求所有事务都必须串行执行,因此能避免一切因并发引起的问题,但效率很低 。
  • 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大 。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed 。它能够避免脏读取,而且具有较好的并发性能 。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制 。
    4. 什么是分布式事务?到此为止,所介绍的事务都是基于单数据库的本地事务,目前的数据库仅支持单库事务,并不支持跨库事务 。而随着微服务架构的普及,一个大型业务系统往往由若干个子系统构成,这些子系统又拥有各自独立的数据库 。往往一个业务流程需要由多个子系统共同完成,而且这些操作可能需要在一个事务中完成 。在微服务系统中,这些业务场景是普遍存在的 。此时,我们就需要在数据库之上通过某种手段,实现支持跨数据库的事务支持,这也就是大家常说的“分布式事务” 。
    这里举一个分布式事务的典型例子——用户下单过程 。
    当我们的系统采用了微服务架构后,一个电商系统往往被拆分成如下几个子系统:商品系统、订单系统、支付系统、积分系统等 。整个下单的过程如下:
    1. 用户通过商品系统浏览商品,他看中了某一项商品,便点击下单
    2. 此时订单系统会生成一条订单
    3. 订单创建成功后,支付系统提供支付功能
    4. 当支付完成后,由积分系统为该用户增加积分
    上述步骤2、3、4需要在一个事务中完成 。对于传统单体应用而言,实现事务非常简单,只需将这三个步骤放在一个方法A中,再用Spring的@Transactional注解标识该方法即可 。Spring通过数据库的事务支持,保证这些步骤要么全都执行完成,要么全都不执行 。但在这个微服务架构中,这三个步骤涉及三个系统,涉及三个数据库,此时我们必须在数据库和应用系统之间,通过某项黑科技,实现分布式事务的支持 。
    5. CAP理论CAP理论说的是:在一个分布式系统中,最多只能满足C、A、P中的两个需求 。
    CAP的含义:
    • C:Consistency 一致性
    • 同一数据的多个副本是否实时相同 。
    • A:Availability 可用性
    • 可用性:一定时间内 & 系统返回一个明确的结果 则称为该系统可用 。
    • P:Partition tolerance 分区容错性
    • 将同一服务分布在多个系统中,从而保证某一个系统宕机,仍然有其他系统提供相同的服务 。
    CAP理论告诉我们,在分布式系统中,C、A、P三个条件中我们最多只能选择两个 。那么问题来了,究竟选择哪两个条件较为合适呢?
    对于一个业务系统来说,可用性和分区容错性是必须要满足的两个条件,并且这两者是相辅相成的 。业务系统之所以使用分布式系统,主要原因有两个:
    • 提升整体性能
    • 当业务量猛增,单个服务器已经无法满足我们的业务需求的时候,就需要使用分布式系统,使用多个节点提供相同的功能,从而整体上提升系统的性能,这就是使用分布式系统的第一个原因 。
    • 实现分区容错性
    • 单一节点 或 多个节点处于相同的网络环境下,那么会存在一定的风险,万一该机房断电、该地区发生自然灾害,那么业务系统就全面瘫痪了 。为了防止这一问题,采用分布式系统,将多个子系统分布在不同的地域、不同的机房中,从而保证系统高可用性 。
    这说明分区容错性是分布式系统的根本,如果分区容错性不能满足,那使用分布式系统将失去意义 。
    此外,可用性对业务系统也尤为重要 。在大谈用户体验的今天,如果业务系统时常出现“系统异常”、响应时间过长等情况,这使得用户对系统的好感度大打折扣,在互联网行业竞争激烈的今天,相同领域的竞争者不甚枚举,系统的间歇性不可用会立马导致用户流向竞争对手 。因此,我们只能通过牺牲一致性来换取系统的可用性和分区容错性 。这也就是下面要介绍的BASE理论 。
    6. BASE理论CAP理论告诉我们一个悲惨但不得不接受的事实——我们只能在C、A、P中选择两个条件 。而对于业务系统而言,我们往往选择牺牲一致性来换取系统的可用性和分区容错性 。不过这里要指出的是,所谓的“牺牲一致性”并不是完全放弃数据一致性,而是牺牲强一致性换取弱一致性 。下面来介绍下BASE理论 。


    推荐阅读