分布式事务seata原理

Seata解析-TM、RM、TC交互流程梳理 本文基于seata 0.7.1版本 seata涉及到三个角色之间的交互,本文通过流程图将AT模式下的基本交互流程梳理一下,为我们以后的解析打下基础。 假设有三个微服务,分别是服务A、B、C,其中服务A中调用了服务B和服务C,TM、TC、RM三者之间的交互流程如下图: 1、服务A启动时,GlobalTransactionScanner会对有@GlobalTransaction注解的方法进行AOP增强,并生成代理,增强的代码位于GlobalTransactionalInterceptor类中,当调用@Gl. 阅读详情

理论基础

CAP指的是一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(CAP的一致性就是强一致性),但可以采用适当的采取弱一致性,即:最终一致性。

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。

BASE理论是柔性事物的理论基础。

分布式事务常用方案

2PC/3PC:依赖于数据库,能够很好的提供强一致性和强事务性,但延迟比较高,比较适合传统的单体应用,在同一个方法中存在跨库操作的情况,不适合高并发和高性能要求的场景。

TCC:适用于执行时间确定且较短,实时性要求高,对数据一致性要求高,比如:互联网金融企业最核心的三个服务:交易、支付、账务。

Saga:由于Saga事务不能保证隔离性,需要在业务层控制并发,适合于业务场景事务并发操作同一资源较少的情况。Saga由于缺少预提交动作,导致补偿动作的实现比较麻烦,例如:业务是发送短信,补偿动作则得再发送一次短信说明撤销,用户体验比较差。所以,Saga事务较适用于补偿动作容易处理的场景。

最终一致性:适用于事务中参与方支持操作幂等,对一致性要求不高,业务上能容忍数据不一致到一个人工检查周期,事务涉及的参与方、参与环节较少,业务上有对账/校验系统兜底。

seata组成结构

seata组成结构:

  • Transaction Coordinator (TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
  • Transaction Manager (TM):控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
  • Resource Manager (RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

其中,TM是一个分布式事务的发起者和终结者,TC负责维护分布式事务的运行状态,而RM则负责本地事务的运行。

seata客户端启动流程

1)自动加载Bean属性和配置信息。

2)初始化TM。

3)初始化RM。

4)初始化分布式事务客户端完成,完成代理数据库配置。

5)连接TC(seata服务端),注册RM和TM。

6)开启全局事务。

seata-AT模式(官方推荐模式)

AT模式主要分为两个阶段:

第一阶段

执行流程:

  • 解析SQL,获取SQL类型(CRUD)、表信息、条件(如:where) 等相关信息。
  • 查询前镜像(改变之前的数据),根据解析得到的条件信息,生成查询语句,定位数据。
  • 执行业务SQL,更新数据。
  • 查询后镜像(改变后的数据),根据前镜像的结果,通过主键定位数据。
  • 插入回滚日志,将前后镜像数据以及业务SQL等信息,组织成一条回滚日志记录,插入到Undo Log表中。
  • 提交前,向TC注册分支,申请全局锁。
  • 本地事务提交,业务数据的更新和生成的Undo Log一起提交。
  • 将本地事务提交的结果通知给TC。

第二阶段

如果没问题,执行提交操作:

执行流程:

  • 收到TC分支提交请求,将请求放入到一个异步任务的队列中,返回提交成功的结果给TC。
  • 异步任务阶段的分支提交请求删除Undo Log中记录。

如果有问题,执行回滚操作:

执行流程:

  • 开启本地事务,通过XID和BranchID查找到对应的Undo Log记录。
  • 根据Undo Log中的前镜像和业务SQL的相关信息生成并执行回滚语句。
  • 提交本地事务,将本地事务的执行结果(分支事务回滚的信息)通知给TC。

seata分布式事务执行示例

如图所示:

执行步骤:

1)TM(订单服务)向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID,XID在微服务调用链路的上下文中传播。

2)RM(订单服务)向TC注册分支事务,执行业务SQL和UNDO_LOG数据的插入。在提交本地事务前,RM会向TC申请关于相关记录的全局锁:

  • 如果申请到了相关记录的全局锁,则直接提交本地事务,并向TC汇报本地事务执行成功(此时全局锁并没有释放,全局锁的释放取决于二阶段是提交命令还是回滚命令)。
  • 如果申请不到相关记录的全局锁,则说明有其他事务也在对这条记录进行操作,因此它会在一段时间内重试,重试失败则回滚本地事务,并向TC汇报本地事务执行失败。

3)执行远程服务调用,即:RM(库存服务)向TC注册分支事务,执行业务SQL和UNDO_LOG数据的插入。执行过程与订单服务一致。

4)TC根据所有的分支事务执行结果,向RM下发提交或回滚命令。

5)RM如果收到TC的提交命令,则释放相关记录的全局锁,再将提交请求放入一个异步任务的队列中,返回提交成功的结果给TC。异步队列中的提交请求执行时,只是删除UNDO LOG表中对应的记录。

6)RM如果收到TC的回滚命令,则会开启一个本地事务,通过XID和Branch ID查找到UNDO LOG表中对应的记录。将UNDO LOG中的后镜像数据与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况需要根据配置策略来做处理。否则,根据UNDO LOG中的前镜像数据和业务SQL的相关信息生成并执行回滚的语句并执行,然后提交本地事务达到回滚的目的,最后释放相关记录的全局锁。

UNDO_LOG表中的记录示例

{
    "branchId": 641789253,
    "undoItems": [
        {
            "afterImage": {
                "rows": [
                     {
                        "fields": [
                            {
                            "name": "id",
                            "type": 4,
                            "value": 1
                            }, {
                            "name": "name",
                            "type": 12,
                            "value": "GTS"
                            }, {
                            "name": "since",
                            "type": 12,
                            "value": "2014"
                            }
                        ]
                    }
                ],
                "tableName": "product"
            },
            "beforeImage": {
                "rows": [
                    {
                        "fields": [
                            {
                            "name": "id",
                            "type": 4,
                            "value": 1
                            }, {
                            "name": "name",
                            "type": 12,
                            "value": "TXC"
                            }, {
                            "name": "since",
                            "type": 12,
                            "value": "2014"
                            }
                        ]
                    }
                ],
                "tableName": "product"
            },
            "sqlType": "UPDATE"
        }
    ],
    "xid": "xid:xxx"
}

为什么seata在第一阶段就直接提交了分支事务?

seata能够在第一阶段直接提交事务,是因为seata为每一个RM维护了一张UNDO_LOG表(这张表需要客户端自行创建),其中保存了每一次本地事务的回滚数据。因此,二阶段的回滚并不依赖于本地数据库事务的回滚,而是RM直接读取UNDO_LOG表的记录,并将数据库中的数据更新为UNDO_LOG中存储的历史数据(前镜像数据和业务SQL)。这也是在使用seata作为分布式事务解决方案时,需要在参与分布式事务的每一个服务中加入UNDO_LOG表。

如果第二阶段是提交命令,则RM并不会对数据进行提交(因为第一阶段已经提交),而是发起一个异步请求删除UNDO_LOG中关于本事务的记录。

注意:由于seata在第一阶段直接提交了本地事务,会造成隔离性问题,因此Seata的默认隔离级别为:Read Uncommitted,而seata也支持Read Committed的隔离级别。

seata使用存在的问题

seata事务代理只是代理局部各自的事务,在原生SQL的前后记录了操作的信息,存储在undo_log表中,seata是采用undo_log生成逆向SQL回滚操作。seata的局部事务已经写到了库中,避免了死锁现象,但容易出现脏读的情况(因为seata默认隔离级别为Read Uncommitted)。

seata-Read Committed隔离级别

seata由于一阶段RM自动提交本地事务的原因,默认隔离级别为Read Uncommitted。如果希望隔离级别为Read Committed,那么可以使用SELECT…FOR UPDATE语句。seata引擎重写了SELECT…FOR UPDATE语句执行逻辑,SELECT…FOR UPDATE语句的执行会申请全局锁 ,如果全局锁被其他事务持有,则释放本地锁(回滚SELECT…FOR UPDATE语句的本地执行)并重试。这个过程中,查询会被阻塞,直到拿到全局锁。

seata实现2PC与传统2PC的差别

架构层次:传统2PC方案的RM实际上是在数据库层,RM本质上就是数据库自身,通过XA协议实现,而Seata的RM是以jar包的形式作为中间件层部署在应用程序侧。

两阶段提交:传统2PC无论第二阶段的决议是commit还是rollback,事务性资源的锁都要保持到第二阶段完成才释放。而Seata的做法是在第一阶段就将本地事务提交,这样就可以省去第二阶段持锁的时间,整体提高效率。

seata使用示例

分布式事务seata的使用请查阅本人发布的另外一篇seata使用示例文章。

分布式事务Seata-原理及四种事务模式 对于分布式事务,通俗地说就是,一次操作由若干分支操作组成,这些分支操作分属不同应用,分布在不同服务器上。分布式事务需要保证这些分支操作要么全部成功,要么全部失败。分布式事务与普通事务一样,都是为了保证操作结果的一致性。Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前, Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双 11,对各 BU 业务进行了有力的支撑。 阅读详情

相关推荐

分布式事务框架Seata的实现原理

介绍 分布式事务相关概念 事务: 并发控制的单元,是用户定义的一组操作序列,需要满足ACID属性。 本地事务:事务由本地资源管理器管理。 分布式事务:事务的操作位于不同的节点。 分支事务:在分布式事务中,由资源管理器管理的本地事务。 全局事务:一次性操作多个资源管理器完成的事务,由一组分支事务组成。 分布式事务实现规范 对于本地事务,可以借助DBMS系统来实现事务的管理,但是对于分布式事务,它就无能为力了。对于分布式事务,目前主要有2种思路:XA协议的强一致规范以及柔性事务的最终一致性规范。

weixin_37512224的博客 1615

分布式事务Seata原理

Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来,需要数据库支持。AT 模式的特点就是对业务无入侵式,用户只需要关注自己的业务SQL,Seata 框架会在第一阶段拦截并解析用户的 SQL,并保存其变更前后的数据镜像,形成undo log,并自动生成事务第二阶段的提交和回滚操作。

张维鹏的博客 2万+

Seata分布式事务实现原理与技术实践深度解析

Seata通过多样化的模式覆盖了分布式事务的主要场景,其AT模式的无侵入设计与TCC的高性能特性尤为突出。未来,随着云原生技术的普及,Seata与Service Mesh的集成、多语言支持将是重要方向。开发者应结合业务需求合理选型,并关注事务隔离与异常处理的细节,以确保系统的高可靠性与一致性。

fudaihb的博客 1226

分布式事务框架Seata原理详解

本文来深度解析下分布式事务框架Seata原理,知其然自其所以然。 文章目录概述 概述 Seata框架是一个业务层的XA(两阶段提交)解决方案。在理解Seata分布式事务机制前,我们先回顾一下什么是两阶段提交和数据库层面的XA方案。 ...

wh柒八九的博客 1万+

【微服务实战系列】Seata的AT模式实现分布式事物

​ 分布式事物根据追求的一致性程度及业务场景可以分为:强一致性、弱一致性、最终一致性。​ 强一致性:任何一次读都能读到某个数据的最近一次写的数据;​ 弱一致性:数据更新之后,如果能容忍的访问只能访问到部分或者全部访问不到,则是弱一致性;​ 最终一致性:不保证在任何时刻数据是完整的(状态一致),但是随着时间的推移,数据和最终达成一致(有一个时间度)。​ AT模式是一种两阶段提交的策略,需要一个全局协调器来协调处理各个分支任务,是⽆侵⼊的分布

qq_36305027的博客 817

告别卡顿!OBS Studio最佳录制参数设置指南(适合游戏/网课/会议场景)

本文提供OBS Studio录制参数优化指南,针对游戏、网课及会议三大场景,详细解析帧率、码率与编码器设置。重点推荐利用硬件编码器(如NVENC)实现游戏录制零卡顿,并分享清晰稳定的网课录制与长时间会议录制配置方案,助你告别视频卡顿与音画不同步问题。

e4f5g6h7的博客 1339

seata分布式事务原理

一、seata是什么 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 Seata主要有两种分布式事务实现方案,AT及TCC 1、AT模式主要关注多 DB 访问的数据一致性,当然也包括多服务下的多 DB 数据访问一致性 问题 2、TCC模式主要关注业务拆分,在按照业务横向扩展资源时,解决微服务间调用的一致性问题 术语: TC (Transacti

qq_20161461的博客 6858

springcloud教程 -- 1.快速搭建入门级demo,看这一篇就够了

废话不多讲,跟紧我,开启你的SpringCloud初体验 首先回顾微服务的基本组成: [图片 here] 生产者:提供服务 消费者:消费服务 服务注册/发现中心:服务注册,发现,监控 所以,首先明白springcloud微服务的架构基础:生产者(client),消费者(client),服务注册/发现中心(server)

叶巨岩的博客 8万+

深入剖析Seata:分布式事务的Java实践与原理探索

Seata 是一个由蚂蚁集团和阿里巴巴联合开源的分布式事务框架,最初名为 Fescar(Fast & Easy Commit And Rollback),后更名为 Seata,寓意“简单可扩展的自治事务架构”。它旨在为微服务架构下的分布式系统提供高效、一致的分布式事务支持。Seata 于 2019 年正式开源,目前由 Apache 基金会孵化,已成为分布式事务领域的标杆工具。Seata 的核心目标是通过非侵入式设计,解决微服务系统中跨服务、跨数据库的数据一致性问题。

lssffy的博客 1760

window系统 dlib库安装

1. 安装visual studio 1.1. 安装vs2017或以上版本 1.2. 我们需要安装使用C++的桌面开发,且必须选上用于Cmake的Visual C++工具 1.3. 安装完成后,将D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin 添加到环境变量PATH中 2 下载cmake文件,并添加环境变量 2.1 在c

@bangbang的博客 817

PayPal支付集成完全指南:开源库实践

本文介绍了如何从零开始集成PayPal支付功能。首先概述了PayPal提供的多语言SDK和开源库,包括PHP、Python、Node.js等版本。然后详细说明了准备工作,包括注册开发者账号、获取API凭证和使用沙盒环境测试。文章以Node.js为例,演示了安装SDK、基础配置和实现支付流程的完整代码,包括创建订单和捕获支付两个核心功能。最后提及了订阅支付等高级功能,为开发者提供了完整的支付集成方案。通过清晰的代码示例和步骤说明,帮助开发者快速实现PayPal支付功能集成。

2501_93501927的博客 1260

Seata分布式事务实现原理深度剖析

在单体架构向微服务架构演进的过程中,"数据一致性"始终是悬在开发者头顶的一把利剑。我在八年Java开发生涯中,曾多次面对这样的场景:一个支付流程需要调用订单服务、账户服务、积分服务,若某一步骤突然失败(如网络波动、服务宕机),如何保证"订单创建了但账户没扣款"或"扣款成功但积分未到账"的情况不会发生?传统的本地事务(如Spring的)依赖数据库的ACID特性,在单库场景下表现完美,但在跨服务、跨数据库的分布式场景中却完全失效。

excellent_fish_c的博客 1277

CODESYS做Modbus TCP主站踩坑记:从IP配置到数据映射的完整避坑指南

本文详细记录了在CODESYS中配置Modbus TCP主站的全过程,从IP配置到数据映射的常见问题及解决方案。重点解析了网络适配器选择、Slave ID误解、地址偏移陷阱等关键问题,并提供了实用的调试技巧和性能优化建议,帮助工业通信开发者高效避坑。

weixin_30642561的博客 625

分布式事务之——Seata原理分析

本文涉及到较多的数据库事务概念,阅读本文前请确保具备必要的相关知识。 事务概述 事务特性 Atomicity-原子性:同一个事务的所有操作,要么全部完成,要么全部不完成 Consistency-一致性:在事务开始之前和结束之后,数据库的完整性未被破坏(符合预期) Isolation-隔离性:可以防止多个事务交叉执行时导致数据不一致;隔离级别由低到高依次为: 读未提交(Read uncommitted) 读已提交(read committed,RC),Oracle等多数数据库的默认隔离级别 可重复

wp120453的博客 2804

使用Python与OpenCV实现基于霍夫变换的圆形缺陷检测与定位详细教程

本文详细探讨了如何使用Python和OpenCV库,通过图像边缘检测和霍夫变换实现圆形对象的检测与缺陷定位。我们不仅介绍了算法的基本原理,还通过具体的代码示例展示了如何在实际应用中实现这些技术。对于工业检测和医学影像分析,本文的方法提供了高效且易于实现的解决方案。随着图像处理技术的不断发展,未来我们可以期待更多新算法和新技术的应用,如深度学习与传统方法的结合,以及多传感器融合技术的引入,这将进一步提升缺陷检测与定位的效率和准确性。

qq_38334677的博客 1298

华为OD机试真题 新系统【小花获胜的奶茶】

华为OD机试真题 新系统【小花获胜的奶茶】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小花获胜的奶茶】多语言题解。

qq_45776114的博客 391

Seata分布式事务实现原理剖析

作为一名有八年Java开发经验的后端工程师,我在多个中大型系统中都遇到过分布式事务的需求。传统的本地事务(如Spring的`@Transactional`)在单体架构中可以很好地保证数据一致性,但在微服务架构中,它显得力不从心。

Minoz_wl的博客 1313

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 403

分布式事务Seata、LCN的原理深度剖析

分布式事务解决方案综述 本文系统介绍了分布式事务的产生背景及解决方案。主要内容包括: 分布式事务产生原因:多数据源、RPC调用异常等情况导致数据不一致 常见解决方案框架:JTA+Atomikos、MQ最终一致性、RocketMQ事务消息、LCN模式、Seata等 CAP与BASE理论:分析了分布式系统设计中的一致性、可用性和分区容错性权衡 LCN实现原理:通过事务分组ID和代理数据源实现事务协调,但存在死锁风险 Seata架构设计:采用TC/TM/RM三组件模式,通过undo_log逆向SQL实现回滚,但可

gonghua0502的专栏 1401

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

分布式事务-Seata原理

分布式事务-Seata

donghao_1009的博客 1884

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Seata分布式事务实现原理

Seata通过创新的AT模式降低了分布式事务的使用门槛,结合灵活的多模式支持,已成为云原生时代分布式事务的首选方案。深入理解其核心实现原理,是构建高可靠事务系统的关键。

KBkongbaiKB的博客 952

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

seata分布式事务原理_深入了解分布式事务组件 Seata (一)

分布式事务的问题,在微服务架构中一直是难题。单体应用实现本地事务即可,到了分布式环境,情况就变得复杂。一个请求可能涉及多个服务,上下游存在依赖关系,其中的一环失败,需要将整个事务回滚。笔者在去年上半年开源过一款微服务的分布式事务组件:lottor,基于可靠消息的柔性分布式事务实现方案。引入的 Lottor 客户端使用比较复杂,具有业务侵入性。推广使用的效果并不是很好。阿里在今年年初开源了...

weixin_39926749的博客 711

【Seata】分布式事务框架原理解析

在单体项目中如果只有一个数据库是不存在分布式事务问题的,通过@Transactional事务管理器就可以管理该数据库事务。Seata是由阿里中间件团队发起的开源分布式事务框架项目,依赖支持本地 ACID 事务的关系型数据库,可以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题,目前提供AT模式(即2PC)、TCC、SAGA 和 XA 的分布式事务解决方案。

祁_z 2992

阿里分布式事务框架Seata,AT模式原理解析

什么是分布式事务 如今在分布式技术盛行下,许多公司都已经在使用分布式技术了,虽然分布式技术给我们项目带来了三高(高可用,高扩展,高性能)等优点,但是缺点也很明显,分布式项目一般都是分服务开发,且多个服务部署在不同的服务器上,这样就产了分布式事务, 使用本地事务技术处理分布式事务就无法生效,此时就需要一个优秀的分布式事务框架来处理 分布式事务基础原理 两阶段提交(2pc)方案 两阶段提交协议(Two Phase Commitment Protocol)中,基于数据库XA协议(mysql5.0.3支持此协议),

weixin_43776652的博客 6213

分布式事务框架Seata原理

- 什么是Seata Seata是由阿里中间件团队发起的开源项目 Fescar,后更名为Seata,它是一个是开源的分布式事务框架。 传统2PC的问题在Seata中得到了解决,它通过对本地关系数据库的分支事务的协调来驱动完成全局事务,是工作在应用层的中间件。主要优点是性能较好,且不长时间占用连接资源,它以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题,它目前提供AT模式(即2PC)...

2万+

seata分布式事务原理_分布式事务框架 Seata

引言Seata 的前身 Fescar 刚开源的时候,就看过相关的文章和代码,代码写得很好,我还在另一个自己的项目中,借鉴了它的很多设计风格。最近想总结一篇关于分布式事务的文章,所以就想以 Seata 为中心,围绕它来细述分布式事务的点点滴滴。 背景互联网系统最初的设计一般都是单库单表,但随着业务数据规模的快速发展,数据量越来越大,单库单表逐渐成为瓶颈。所以,在这个阶段一般都会对数据库进行水平拆分,...

weixin_39635314的博客 384
上一篇: 分布式事务Seata
下一篇: 一文搞懂二分查找算法
南秋同学
博客等级 码龄7年 65粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值