【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案

微服务架构的分布式事务解决方案

  • 前提介绍
  • 知识系统回顾
    • 事务
      • ACID
      • 事务的难点
      • 刚性事务和柔性事务
    • 刚性事务
      • 优点
      • 局限
    • 分布式事务
      • 全局事务(DTP模型)— 标准分布式事务
        • 全局事务(DTP模型) — XA
          • XA接口的实现
          • XA的2PC机制
            • 2PC机制的分析
          • 2PC机制的局限
        • JavaEE平台中的分布式事务实现
          • 优点
          • 局限
      • 刚性事务解决方案的利弊
    • 柔性事务
      • Base协议
      • CAP协议
      • 柔性事务中的服务模式
        • 可查询操作
          • 服务操作的可标识性
        • 幂等操作
          • 幂等性(ldempotenty)
          • 实现方式
        • TCC操作
          • Try(尝试):尝试执行业务操作
          • Confirm(确认):确认执行业务操作
          • Cancel(取消):取消执行业务操作
          • 与2PC协议比较
        • 可补偿操作
          • Do(真正执行业务)
          • Compensate(业务补偿)
          • 约束
      • 可靠消息最终一致(异步确保型)
        • 约束
          • 用到的服务模式
        • 成本
        • 优点和适用范围
      • 最大努力通知
  • 总结

前提介绍

通过之前的两篇文章《【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(上)》和《【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(中)》,您已经对微服务架构中常用的分布式事务解决方案有了初步的了解。接下来,我们将对这些解决方案进行综合分析和总结。

在这两篇文章中,我们深入探讨了分布式事务的重要性和挑战,并介绍了几种常用的分布式事务解决方案,如两阶段提交、补偿事务和消息队列等。这些解决方案在不同的场景下具有各自的优势和适用性。

知识系统回顾

事务

事务是一组操作,它们被组织在一起形成一个可靠、独立的工作单元。这个工作单元能够保证一系列操作的完整性和一致性,即使在系统故障或其他异常情况下也能保持数据的完整性和一致性。

在这里插入图片描述

ACID

事务处理是数据库管理系统中的基本概念,用于维护数据库的完整性和一致性,以及在多个用户之间实现并发控制和数据共享。事务具有原子性、一致性、隔离性和持久性的特性,确保数据库操作的正确性和可靠性。
在这里插入图片描述

事务的难点

  • 高度并发:当多个事务同时对数据库进行操作时,如何确保每个事务都能够正确、独立地完成,并且不会相互干扰,是事务处理的一大挑战。高度并发可能导致资源争用、死锁和数据不一致等问题,需要采取有效的并发控制策略来处理。

  • 资源分布:在分布式数据库系统中,事务可能涉及多个节点和资源,如数据存储、网络通信等。资源分布的复杂性增加了事务处理的难度,需要确保事务在分布式环境中的一致性、可靠性和原子性。

  • 大时间跨度:一些事务可能需要较长时间来完成,如批处理、大数据处理等。在这种情况下,事务的执行可能会受到系统故障、网络中断或其他异常因素的影响。为了确保大时间跨度的事务能够正确完成,需要采取持久性机制、恢复机制和事务回滚等技术来保证数据的一致性和完整性。

刚性事务和柔性事务

分布式事务总体可以分为两大种类型:刚性事务和柔性事务。
在这里插入图片描述

刚性事务

事务是由资源管理器(如数据库管理系统,DBMS)在本地进行管理的。它仅限于单个数据库的本地操作,并且仅限于单个进程内。因此,本地事务并不涉及多个数据来源。

在这里插入图片描述
这种事务处理方式具有局限性,但在处理单个数据库和进程中的数据操作时,可以提供良好的完整性和一致性保证。

优点

在这里插入图片描述

局限

本地事务的问题主要包括不具备分布事务处理能力和隔离的最小单位由资源管理器决定。

  • 本地事务只能处理单个数据库或单个进程内的事务,而无法处理跨多个数据库或分布式环境的事务。

在分布式系统中,数据可能分布在多个节点上,需要协调和同步各个节点上的事务操作以保证数据一致性和完整性。本地事务无法满足这种需求,因此不具备分布事务处理能力。

  • 本地事务的隔离的最小单位由资源管理器决定。

分布式事务

分布式事务涉及几个主要的核心概念和要素,它们对于实现分布式系统的一致性和可靠性至关重要。

  • 全局事务:全局事务由事务管理器全局管理,涉及多个参与者和资源。全局事务的管理确保了所有相关操作的一致性和正确性。

  • 事务管理器:事务管理器是负责管理全局事务状态和参与的资源的组件。它协调并监控所有参与者的操作,并确保所有资源的一致性提交或回滚。

  • 事务协议(TX协议):TX协议是应用或应用服务器与事务管理器之间的接口协议。它定义了事务的开始、提交和回滚等操作,并提供了协调和通信机制,以确保分布式环境下的事务一致性。

  • 分布式事务协议(XA协议):XA协议是全局事务管理器与资源管理器之间的接口协议。它定义了全局事务管理器如何与资源管理器进行通信,并协调资源的提交或回滚操作。

XA协议提供了一种标准化的方式来实现分布式事务的一致性和可靠性。

全局事务(DTP模型)— 标准分布式事务

在这里插入图片描述
以下是对这段内容的润色和优化:

  • AP(Application Program):应用程序,即使用分布式事务处理(DTP)的程序。它通过与事务管理器进行交互来对资源进行控制和操作。

  • RM(Resource Manager):资源管理器,可以是数据库管理系统(DBMS)或消息中间件等。应用程序通过资源管理器来控制和管理实际资源,并且这些资源必须实现XA定义的接口。

  • TM(Transaction Manager):事务管理器,负责协调和管理事务的执行。它提供给应用程序编程接口(API),以便应用程序能够定义和管理事务,并与资源管理器进行交互。事务管理器控制全局事务的生命周期,协调各个资源管理器的操作。

事务管理器和资源管理器在分布式事务处理中扮演着关键角色。事务管理器负责整个事务的管理和协调,而资源管理器负责实际资源的控制和管理。

全局事务(DTP模型) — XA

XA是由X/Open组织提出的用于分布式事务的规范。它主要定义了全局事务管理器(TM)和局部资源管理器(RM)之间的接口。许多主流的关系型数据库产品都已经实现了XA接口。

XA规范提供了一种标准化的方式来实现分布式事务的管理和协调。通过TM和RM之间定义的接口,可以实现跨多个资源管理器的全局事务的操作和控制。

在这里插入图片描述

XA接口的实现
  • XA接口是双向的系统接口,在事务管理器™以及一个或多个资源管理器(RM)之间形成通信桥梁。

  • XA之所以需要引入事务管理器是因为,在分布系统中,从理论上讲两台机器理论上无法达到一致的状态,需要引入一个单点进行协调。

  • 由全局事务管理器管理和协调的事务,可以跨越多个资源(如数据库或MS队列)和进程。全局事务管理器一股使用XA二阶段提交协议与数据库进行交互。

XA的2PC机制

两阶段提交协议(Two-phase commit protocol)是XA用于在全局事务中协调多个资源的机制。
在这里插入图片描述
TM和RM间采取两阶段提交(Two Phase Commit)的方案来解决一致性问题,两阶段提交需要一个协调者™来掌控所有参与者节点(RM)的操作结果并且指引这些节点是否需要最终提交。

2PC机制的分析

准备操作与ACID状态控制

  • A:准备后,仍可提交与回滚
  • C:准备时,一致性检查必须OK
  • I :准备后,事务结果仍然只在事务内可见
  • D:准备后,事务结果已经持久
2PC机制的局限
  • 协议成本:在分布式事务中,准备操作是否必需是一个重要的考虑因素。
  • 准备阶段的特性成本:准备阶段所需的成本是必须考虑的。
  • 全局事务状态的持久成本:保持全局事务状态的持久性有一定的成本。
  • 多个潜在故障点所带来的脆弱性:分布式系统中存在多个潜在故障点,可能会增加系统的脆弱性。
  • 准备阶段后、提交前发生故障可能会引发一系列难以解决的隔离和恢复问题。
JavaEE平台中的分布式事务实现
  • JTA(Java Transaction API):面向应用程序、应用服务器和资源管理器的高级事务接口。它提供了一套用于管理和协调事务的方法和接口。

  • JTS(Java Transaction Service):JTA事务管理器的实现标准,向上支持TA(Transaction Application),向下通过CORBA OTS(Common Object Request Broker Architecture Object Transaction Service)实现跨事务域的互操作性。

  • EJB(Enterprise JavaBeans):一种基于组件的应用程序编程模型,通过声明式事务管理进一步简化事务应用的编程。它提供了一种轻松管理事务的方式,使开发人员能够专注于业务逻辑的实现。
    在这里插入图片描述
    JTA和JTS为开发人员提供了面向应用程序和应用服务器的高级事务接口,使得事务的管理变得更加简单和灵活。而EJB作为一种应用程序编程模型,通过声明式事务管理进一步简化了事务应用的开发。

优点
  • 简单一致的编程模型
  • 跨域分布处理的ACID保证
局限
  • DTP模型本身的局限

刚性事务解决方案的利弊

  • 优点:严格的ACID

  • 缺点:效率较低(不适用于微服务架构)

    • 在全局事务模式下,全局事务管理器(TM)通过XA接口使用二阶段提交协议(2PC)与资源层(如数据库)进行交互。使用全局事务时,数据会在整个事务期间被锁定,直到全局事务结束。

    • 2PC采用反可伸缩模式,在事务处理过程中,参与者需要一直持有资源直到整个分布式事务结束。随着业务规模的增大,2PC的局限性变得越来越明显,系统的可伸缩性会受到影响。

    • 与本地事务相比,使用XA协议的系统开销相当大,因此在考虑是否真正需要分布式事务时应该谨慎。此外,只有支持XA协议的资源才能参与分布式事务。

柔性事务

在这里插入图片描述

Base协议

  • BA(Basic Availability):基本业务可用性,即系统在面对分区失败时仍然能够保持部分可用状态。
  • S(Soft State):柔性状态,允许系统中的状态在一段短暂时间内不同步,即允许异步的状态变更。
  • E(Eventual Consistency):最终一致性,在一定时间内保证数据最终达到一致状态,尽管不是实时一致。
  • 原子性(A)和持久性(D)是不可或缺的要求,必须得到严格保障。为了满足可用性、性能和服务降级的需求,需要降低一致性(C)和隔离性(I)的要求。

酸碱平衡(ACID-BASE Balance)

CAP协议

定理:对于共享数据系统,最多只能同时满足CAP中的两个要素,无法同时满足三个要素。每种组合都有适用的场景。
在这里插入图片描述
真实的系统应该是ACID和BASE的混合体。ACID提供了强一致性和可靠性,适用于那些对数据一致性要求高的业务场景。而BASE则提供了更高的可用性和分区容错性,适用于对数据一致性要求相对较低的场景。

不同类型的业务应该根据其特点进行区别对待。对于核心的、对数据一致性要求严格的业务,应该优先考虑ACID特性。而对于非核心业务或对实时一致性要求不高的业务,可以灵活选择BASE特性来提高可用性和性能。

柔性事务中的服务模式

可查询操作

在这里插入图片描述

服务操作的可标识性
  • 服务操作具有全局唯一标识
    • 可以使用业务单据号(如订单号)
    • 使用系统分配的操作流水号(如支付记录流水号)
    • 使用操作资源的组合组合标识(如商户号+商户订单号)
  • 操作有唯一的、确定的时间(约定以谁的时间为准)
幂等操作

重复调用多次产生的业务结果与调用一次产生的业务结果相同

幂等性(ldempotenty)
f(f(x))  =  f(x)
实现方式
  • 通过业务操作本身实现幂等性
  • 系统缓存所有请求与处理结果
  • 检测到重复请求之后,自动返回之前的处理结果
TCC操作

在分布式事务中执行业务操作。首先,在Try阶段完成业务检查和预留资源。在确认无误后,执行业务操作并在Confirm阶段使用预留的资源。如果需要取消操作,可以在Cancel阶段释放已预留的资源。
在这里插入图片描述

Try(尝试):尝试执行业务操作
  • 完成所有业务检查,确保数据的一致性。
  • 预留必要的业务资源,以保证准隔离性。
Confirm(确认):确认执行业务操作
  • 真正执行业务操作。
  • 无需再进行业务检查。
  • 只使用在Try阶段预留的业务资源。
  • Confirm操作要满足幂等性。
Cancel(取消):取消执行业务操作
  • 释放在Try阶段预留的业务资源。
  • Cancel操作要满足幂等性。

TCC操作中的Confirm操作和Cancel操作,其实也可以看作是补偿操作

与2PC协议比较
  • 位于业务服务层而非资源层,使得分布式事务的控制逻辑更加灵活。
  • 不需要单独的准备(Prepare)阶段,简化了事务的处理流程。
  • Try操作兼备资源操作和准备能力,能够在一步完成业务操作和资源锁定。
  • Try操作允许根据具体业务需求灵活选择业务资源的锁定粒度,以满足不同的场景需求。
  • 较高的开发成本,因为需要对业务逻辑进行详细的设计和实现。

与传统的2PC协议相比,这种基于Try-Confirm-Cancel模式的分布式事务处理方式在业务服务层进行控制,提供了更大的灵活性和可定制性。

同时,由于没有独立的准备阶段,整个流程更加简化。然而,这种方式也可能带来更高的开发成本,因为需要对业务逻辑进行更详细的设计和实现。

可补偿操作

一种基于补偿的分布式事务处理方式。在Do阶段执行实际的业务操作,并对外提供可见的业务执行结果。如果发生错误或异常情况,通过Compensate(业务补偿)操作来反转或纠正之前的业务操作结果。补偿操作必须具备幂等性,以确保多次执行不会产生不一致的结果。
在这里插入图片描述

Do(真正执行业务)

执行实际的业务操作。

  • 完成业务处理。
  • 业务执行结果对外可见。
Compensate(业务补偿)

补偿(或部分补偿)正向业务操作的结果。

  • 抵销或修正之前执行的正向业务操作的结果。
  • 补偿操作必须满足幂等性要求。
约束
  • 补偿在业务上是可行的,即存在补偿措施可以修复或抵消业务操作的结果。
  • 风险和成本由于业务执行结果未隔离或补偿不完整带来的风险和成本应该是可以控制的。

可靠消息最终一致(异步确保型)

  1. 在业务处理服务提交业务事务之前,向实时消息服务发送消息请求,实时消息服务只记录消息数据而不实际发送。在业务事务提交后,业务处理服务向实时消息服务确认发送。

  2. 只有在收到确认发送指令后,实时消息服务才真正发送消息。

  3. 在业务事务回滚后,业务处理服务向实时消息服务取消发送。然后,消急状态确认系统定期检查未确认发送或回滚发送的消息,并向业务处理服务询问消息状态。根据消急ID或消息内容,业务处理服务确定消息是否有效。
    在这里插入图片描述

约束

被动方的处理结果不影响主动方的处理结果,被动方的消息处理操作是幂等的,确保业务数据可靠的前提下,实现业务数据的最终一致。

用到的服务模式

可查询操作、幂等操作

成本
  • 建设可靠的消急系统的成本,兼容所有实现)MS标准的MQ中间件

  • 一次消息的发送需要两次请求,因此业务处理服务需要实现消息状态回查接口。

优点和适用范围
  • 消息数据独立存储,降低了业务系统与消息系统之间的耦合。
  • 对于对最终一致性时间敏感性较高的场景,降低了业务被动方实现的成本。

最大努力通知

在业务活动的主动方完成业务处理后,向业务活动的被动方发送消息。允许消息丢失。业务活动的被动方根据定时策略,向业务活动的主动方查询,以恢复可能丢失的业务消息。
在这里插入图片描述
被动方的处理结果不会影响主动方的处理结果,适用于对业务最终一致性的时间敏感度较低的场景,特别是跨企业的业务活动。

这种实现方式允许业务活动的主动方发送消息给被动方,但允许消息的丢失。被动方根据定时策略进行查询,以确保消息的完整性。适用于对业务最终一致性的时间敏感度较低的场景,特别是跨企业的业务活动。


总结

常用的分布式事务解决方案包括:

  • 刚性事务:

    • 全局事务:也称为标准的分布式事务,涉及多个参与者和资源的一致性操作。
  • 柔性事务:

    • 可靠消息最终一致:通过异步确保型机制,使用可靠消息传递保证数据最终一致性。
    • TCC(两阶段型、补偿型):通过两阶段提交和补偿机制来实现分布式事务的一致性。
    • 最大努力通知:通过非可靠消息机制和定期校对来尽力保证最终一致性。
    • 纯补偿型:通过纯补偿机制处理分布式事务,可能无法保证100%的一致性。

这些分布式事务解决方案都是在不同的场景下应用的,根据具体需求选择合适的方案可以提高系统的可靠性和性能。请注意,每种方案都可能存在一定的限制和适用性,需要根据业务需求进行权衡和选择。

结论:分布式系统中,最重要的是满足业务需求,而不是追求抽象、绝对的系统特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市信息模型平台顶层设计与实践-CIM-读书笔记

城市信息模型平台顶层设计与实践-CIM-读书笔记 1、地理空间框架 GB/T 30317—2013《地理空间框架基本规定》规定地理空间框架为:“地理信息数据及其采集、加工、交换、服务所涉及的政策、法规、标准、技术、设施、机制和人力资源的总称,由基础地理信息…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音合成(二)

官方文档链接:https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件,目前该插件仅认证后的小程序。 语音合成…

排序算法之八:计数排序

1.计数排序思想 计数排序,顾名思义就是计算数据的个数 计数排序又称非比较排序 思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤: 统计相同元素出现次数 根据统计的结果将序列回收到原来的序列中 计数…

HNU-算法设计与分析-实验2

算法设计与分析实验2 计科210X 甘晴void 202108010XXX 目录 文章目录 算法设计与分析<br>实验21 用动态规划法实现0-1背包问题重述想法代码验证算法分析 2 用贪心算法求解背包问题问题重述想法代码验证算法分析 3 半数集问题&#xff08;实现题2-3&#xff09;问题重述…

Ubuntu 22.04 安装Fail2Ban

Fail2Ban是一种用来防止暴力破解的工具&#xff0c;一般要和iptables配合使用。其原理是读取系统日志&#xff0c;并通过正则表达式匹配&#xff0c;监控IP在一段时间内的登录尝试、身份验证失败日志等并进行计数。超过阈值则进行IP封禁&#xff0c;过一段时间后再解封。 总的…

ant design vue Tree组件叶子节点横向排列

antdesignvue的树形组件要实现组件叶子节点横向排列有点坑&#xff0c;没有 配置属性&#xff0c;需要自己想办法。 要实现的效果 看tree组件的dom结构&#xff0c;父元素flex竖向布局&#xff0c;子项不论节点层级都在同一层&#xff01;&#xff01;&#xff01; 难点在于想…

8个 Python 开发者必备的 PyCharm 插件

这8个顶级插件保证了更快、更轻松、更愉悦的开发过程。 在 PyCharm 插件列表中&#xff0c;我们发现了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发。 今天我就给大家逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://…

Openlayer【四】—— 控件

控件 控件是一个可见的小部件&#xff0c;其 DOM 元素位于 屏幕。它们可以涉及用户输入&#xff08;按钮&#xff09;&#xff0c;也可以仅供参考; 位置是使用 CSS 确定的。默认情况下&#xff0c;它们位于 容器&#xff0c;但可以使用 任何外部 DOM 元素。 其中ol/control是…

定时器中断控制的独立式键盘扫描实验

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit S1P1^4; //将S1位定义为P1.4引脚 sbit S2P1^5; //将S2位定义为P1.5引脚 sbit S3P1^6; //将S3位定义为P1.6引脚 sbit S4P1^7; //将S4位定义为P1.7引脚 unsigned char keyval; /…

50天精通Golang(第18天)

web开发介绍、iris框架安装、HTTP请求和返回、Iris路由处理 一 Web项目开发介绍及实战项目介绍 1.1 引言 本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法。通过本系列视频课程&#xff0c;大家能够从零到一经历一个完整项目的开发&#xff0c;并在课程…

【栈】Leetcode 496 下一个更大元素I

【栈】Leetcode 496 下一个更大元素I 解法1 两个单调栈解法2 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 两个单调栈 两个栈进行操作&#xff0c;一个栈用来遍历寻找&#xff0c;一个栈用来保留 将nums2中的元素…

NLP论文阅读记录 - 2021 | WOS 利用 ParsBERT 和预训练 mT5 进行波斯语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法A. 序列到序列 ParsBERTB、mT5 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Leveraging ParsBERT and Pretrained …

鸿蒙开发之组合手势

当我们需要支持多个手势的时候&#xff0c;可以通过GestureGroup来实现&#xff0c;如下实现了同时支持Tap和Pan手势 import Prompt from system.prompt Entry Component struct OfficialGestureGroupPage {State message: string Hello Worldbuild() {Column() {Column() {T…

STM32WL用户手册学习

介绍 STM32Cube是意法半导体的原创产品&#xff0c;通过减少开发工作量、时间和成本来显著提高开发人员的生产力。STM32Cube涵盖了整个STM32产品组合。 STM32Cube包括&#xff1a; 一套用户友好的软件开发工具&#xff0c;涵盖项目开发从设计到生产&#xff0c;其中&#xf…

算法第十九天-二叉搜索树节点最小距离

二叉搜索树节点最小距离 题目要求 解题思路 今天题目重点&#xff1a; 1.二叉搜索树&#xff08;BST&#xff09; 2.任意两个不同节点 遇到二叉搜索树&#xff0c;立即想到这句话&#xff1a;[二叉搜索树&#xff08;BST&#xff09;的中序遍历是有序的]。这是解决所有二叉搜…

全网最细RocketMQ源码四:消息存储

看完上一章之后&#xff0c;有没有很好奇&#xff0c;生产者发送完消息之后&#xff0c;server是如何存储&#xff0c;这一章节就来学习 入口 SendMessageProcessor.processRequest private CompletableFuture<RemotingCommand> asyncSendMessage(ChannelHandlerCont…

【现代密码学】笔记5--伪随机置换(分组加密)《introduction to modern cryphtography》

【现代密码学】笔记5--伪随机置换&#xff08;分组加密&#xff09;《introduction to modern cryphtography》 写在最前面5 伪随机排列实践构造&#xff08;块密码/分组密码&#xff09; 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充&…

pve虚拟机的改名和修改ID

PVE的虚拟机名字在web界面是无法修改id和名字的。要注意id和名字不能重。 在使用备份时就发现虚拟机是以虚拟机id作为维一标识&#xff0c;如果有多台pve节点&#xff0c;但共用同一个nfs目录备份或使用同一个pbs进行备份时就必须保障id的唯一性。这时可以使用这个方法来进行补…

MySQL使用通配符进行数据搜索以及过滤

目录 1.什么是通配符&#xff1f; 2.通配符之→百分号(%) 3.通配符之→下划线(_) 4.通配符使用注意事项 *本文涉及概念来源于图灵程序设计丛书&#xff0c;数据库系列——《MySQL必知必会》 1.什么是通配符&#xff1f; 通配符(wildcard) &#xff1a;用来匹配值的一部分…

scrollTop与offsetTop解决小分辨率区域块向上滚动效果效果,结合animation与@keyframes实现标题左右闪动更换颜色效果。

scrollTop 是一个属性&#xff0c;它表示元素的滚动内容垂直滚动条的位置。对于可滚动元素&#xff0c;scrollTop 属性返回垂直滚动条滚动的像素数&#xff0c;即元素顶部被隐藏的像素数。 offsetTop 是一个属性&#xff0c;用于获取一个元素相对于其父元素的垂直偏移量&…