你不知道的MySQL事务隔离级别,阿里大佬带你庖丁解牛,深度解析

SpringBoot注解实战:从核心原理到高频场景避坑指南 在Java企业级开发中,依赖注入和面向切面编程是构建松耦合、可维护应用的核心技术。Spring框架通过注解机制,将配置和业务逻辑以声明式的方式组织起来,极大地提升了开发效率。其核心原理在于IoC容器管理Bean的生命周期,并通过AOP代理实现横切关注点的统一处理。这种设计模式的技术价值在于实现了关注点分离,让开发者能专注于业务逻辑。在Web开发、数据持久化、事务管理等应用场景中,注解如@Autowired、@Transactional、@RestController等成为标配。本文聚焦SpringBoot注 阅读详情

MySQL是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)。我们可以同时在不同的会话里输入各种语句,这些语句可以作为事务的一部分进行处理。不同的会话可以同时发送请求,也就是说服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。我们前边说过事务有一个特性称之为隔离性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样子的话对性能影响太大,所以设计数据库的大叔提出了各种隔离级别,来最大限度的提升系统并发处理事务的能力,但是这也是以牺牲一定的隔离性来达到的。

想必事务大家都已经非常熟悉了,它是一组SQL组成的一个执行单元,要么全执行要么全不执行,这也是它的一个特性——原子性。而事务的应用场景也非常广泛,最经典的就是转账问题,A给B打钱,不能出现A钱扣了B还没收到的状况,否则业务就乱套了。

事务的特性

于是呢,根据用户对这些场景的严苛要求,总结出了事务应该具备的四个特性,分别是原子性、一致性、隔离性、持久性,简称事务的ACID属性。

原子性

Atomicity,事务是一个最小的执行单位,事务里面的SQL要么全执行,要么全不执行,就拿A与B转账为例,一条语句从A里扣钱,另一条语句往B身上加钱,如果这两条语句不能全部执行,而是成功了一部分,那事务就没有存在的意义了。

隔离性

Isolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?如果一个事务正在操作的数据被另一个事务修改或删除了,最后的执行结果可能无法达到预期。如果没有隔离性还会导致其他问题,稍后会有所说明。

持久性

Durable,意为事务完成了对数据的修改之后,修改的结果是永久性生效的。

一致性

Consistent,把一致性放在最后讲的原因是前三个比较容易理解,而一致性的概念很模糊。

一致性是指事务使得应用系统从一个正确的状态到另一个正确的状态。

知乎上面一个高赞回答的很特别,原子性、隔离性、持久性是数据库事务的基本特征,而一致性是由AID这三个特征来保证的。

那么怎么理解这句话呢?还拿转账为例,如果A手里有100元,转给B120元,显然A手里的钱不够扣,假如你给金额这一列设置了不能小于0的约束,那么在事务执行的时候监测到约束没被满足,就会回滚,这时可以说事务保证了一致性。同样的,如果你没有添加约束,而是在业务层做了校验,并做了回滚,那么也可以说事务保证了一致性。那如果数据库和业务层都没有做约束呢,A的钱不就变为负数了吗?这实际上也是保证了一致性,因为执行前后并没有破坏任何约束,它的状态一直都是正确的。

事务并发带来的问题

前面讲到了事务的隔离性,如果要提升系统的吞吐量,当有多个任务需要处理时,应当让多个事务同时执行,这就是事务的并发。既然事务存在并发执行,那必然产生同一个数据操作时的冲突问题,来看一下都会出现什么问题。

更新丢失

Lost Update,当两个事务更新同一行数据时,双方都不知道对方的存在,就有可能覆盖对方的修改。比如两个人同时编辑一个文档,最后一个改完的人总会覆盖掉前面那个人的改动。

脏读

Dirty Reads,一个事务在执行时修改了某条数据,另一个事务正好也读取了这条数据,并基于这条数据做了其他操作,因为前一个事务还没提交,如果基于修改后的数据进一步处理,就会产生无法挽回的损失。

不可重复读

Non-Repeatable Reads,同样是两个事务在操作同一数据,如果在事务开始时读了某数据,这时候另一个事务修改了这条数据,等事务再去读这条数据的时候发现已经变了,这就是没办法重复读一条数据。

幻读

Phantom Read,与上方场景相同,事务一开始按某个查询条件没查出任何数据,结果因为另一个事务的影响,再去查时却查到了数据,这种就像产生幻觉了一样,被称作幻读。

事务的四种隔离级别

首先,更新丢失这种问题应该是由应用层来解决的,因为数据库没有办法控制用户不去更新某条数据。但是另外三个问题是可以得到解决的,既然有方案解决解决它不就好了,干嘛还要设置这么多隔离级别呢?

刚才说了,如果我们要性能好、吞吐量提升,那就不得不付出一些代价,如果要做到完全没有副作用,那么就只需要让事务排队执行就好了,一个一个执行绝对不会出现脏读幻读的问题,但是这样会导致数据库处理的非常慢。那怎么办呢?官方唯一能做的就是给你提供各种级别的处理方式,由你根据具体业务场景选择,于是就有了隔离级别。

读未提交 Read uncommitted

读未提交其实就是事务没提交就可以读,很显然这种隔离级别会导致读到别的还没提交的数据,一旦基于读到的数据做了进一步处理,而另一个事务最终回滚了操作,那么数据就会错乱,而且很难追踪。总的来说说,读未提交级别会导致脏读。

读提交 Read committed

顾名思义就是事务提交后才能读,假设你拿着银行卡去消费,付钱之前你看到卡里有2000元,这个时候你老婆在淘宝购物,赶在你前面完成了支付,这个时候你再支付的时候就提示余额不足,但是分明你看到卡里的钱是够的啊。

这就是两个事务在执行时,事务A一开始读取了卡里有2000元,这个时候事务B把卡里的钱花完了,事务A最终再确认余额的时候发现卡里已经没有钱了。很显然,读提交能解决脏读问题,但是解决不了不可重复读。

Sql Server,Oracle的默认隔离级别是Read committed。

可重复读 Repeatable read

看名字就看出来了,它的出现就是为了解决不可重复读问题,事务A一旦开始执行,无论事务B怎么改数据,事务A永远读到的就是它刚开始读的值。那么问题就来了,假设事务B把id为1的数据改成了2,事务A并不知道id发生了变化,当事务A新增数据的时候却发现为2的id已经存在了,这就是幻读。

MySQL的默认隔离级别就是Repeatable read。

串行化 serializable

这个就是最无敌的存在了,所有的事务串起来一个个执行,因为没有并发的场景出现了,什么幻读、脏读、不可重复读统统都不存在的。但是同样的,基本并发能力会非常差。最终,到底什么隔离级别完全要根据自己的业务场景选择,没有最好的,只有最适合的。

表格比较

隔离级别脏读不可重复读幻读
Read uncommitted是是是
Read committed否是是
Repeatable read否否是
serializable否否否

通过本文,大家了解了MySQL的事务隔离级别了吗?欢迎大家多多留言交流。

另外小编也帮大家整理了一些MySQL相关学习资料,有需要的朋友请关注小编,并私信回复【学习】即可得到免费领取方式哦~~~

 

性能优化的本质:从线程模型与数据流拆解系统瓶颈 在分布式系统中,性能问题往往不是由框架本身导致,而是源于对数据流动本质和线程执行机制的误判。理解‘数据如何被抽取、处理、落库’这一基础链路,比熟记Storm参数或RocketMQ配置更为关键;掌握线程生命周期、连接池竞争、IO与CPU密集型任务的调度差异,则是定位阻塞、上下文切换、资源争用等真实瓶颈的核心能力。本文以真实生产案例切入,聚焦Java服务中线程模型重构、连接池解耦、异步缓冲设计等工程实践,揭示如何通过日志三维分析(事件-时间-线程)、物理动作拆解(抽水→过滤→存池)和可追踪线程命名等方法,将模糊 阅读详情

相关推荐

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

本文素材来源于一位粉丝分享经验,希望能帮助到更多朋友 前言 毕业以来,还算顺利的进入一家互联网公司,从事Java后端的开发。一路走来将近八年的光景,期间经历过刚毕业工作的狂喜,也遇到过因工作失误而受到的打击。我觉得这都是一种历练,经过这些磨砺,算是学到了不少东西,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且对面试这块也做了一些研究和相应的准备。希望分享出来能帮到更多朋友们的学习、面试,为金九银十做准备。 三面头条 面试岗位是后台研发工程师,地点选择了上海,通过大佬内推,跳..

python6_quanzhan的博客 2926

用 Arthas “庖丁解牛”

作者 | Halimao Java、go 爱好者(https://github.com/halimao/) 【Arthas 官方社区正在举行征文活动,参加即有奖品拿哦~点击投稿】 生产环境的 bug 开发环境无法复现怎么办?关键位置没有打印日志信息不足怎么办?莫慌,骚年。让强大的 Arthas法师来 carry,带你去生产环境"遨游"闯关。 刚接触 Arthas,就被它能够 watch 方法的输入参数和返回值的功能震惊到了。这简直太酷炫了,让你可以像本地单步调试一样,跟踪到每一步的执行结果和获取当前的变量

阿里巴巴云原生的博客 361

这十年,阿里开发者毕玄的日常

阿里妹导读:“他始终以开发者自居,是因为对技术爱得深沉。”本文整理自2018杭州云栖大会开发者生态峰会的现场速记,阿里巴巴中间件负责人、 开发者毕玄,分享了他在阿里十多年...

阿里技术 5110

保姆级教程:从 TLE 数据源获取到 Cesium 卫星轨迹可视化全流程(含常见报错排查)

本文提供从TLE数据源获取到Cesium卫星轨迹可视化的全流程保姆级教程,涵盖数据预处理、satellite.js计算、Cesium集成及性能优化等关键步骤,并针对常见报错提供详细排查方案,帮助开发者高效实现卫星轨迹可视化。

weixin_29002595的博客 296

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1182

【阿里开发者】2018-2022年精选文章-后端篇

代码重构:面向单元测试从业务开发中学习和理解架构设计深度解读 RocketMQ 存储机制提升Java字符串编码解码性能的技巧解决微服务架构下流量有损问题的实践和探索淘系用户平台技术团队单元测试建设异步任务处理系统,如何解决业务长耗时、高并发难题?Redis消息队列发展历程一文搞懂redis系统性能分析从入门到进阶领域驱动编程,代码怎么写?Java应用结构规范MySQL 深潜 - MDL 锁的实现与获取机制并发-分布式锁质量保障总结重新认识访问者模式:从实践到本质谈一谈单元测试Redis 7.0 Multi

后端研发工程师Marion的博客 1693

MTK-Android12开机应用自启需求-自定义原生Launcher3 主界面布局图标

MTK平台 Android12 版本 上实现 开机应用自启需求-自定义原生Launcher3 主界面布局图标。添加一个属性定义即可,如下:这里自定义一个属性目的是为了在加载Launcher3启动时候从属性获取需要自启动应用的包名,可以扩展动态替换 自启动包名。这里有两种方案,要么在Launcher3里面实现,要么在系统服务里面在开机时候启动第三方一次。这里强烈建议在Launcher3中去实现,体验效果更好。// 第一步:定义属性,// 第二步:在onCreate 方法中获取属性并启动应用。

十年饮冰,难凉热血 1381

该怎样才能成为高薪架构师?阿里P8大牛给迷茫的程序员一些中肯建议“请不要再虚度光阴了”。

最近好多人私信问我,该怎样才能成为高薪架构师,还有一个就对当前的状态感到迷茫,我在此做一个简单的说明,或者对迷茫中的你来说有些许帮助。   当前你感到迷茫吗?   有很多人对现在的工作感到很没意思,因为当前的工作,完全是实现业务,技术上没有任何提高。在这种状态下就会感到迷茫,特别是一想到将来这种迷茫感就更强烈了。   与其说迷茫还不如说是担忧,随着时间的推移,自己的技术又没有长进,所以感觉忧心忡忡。   这里分为二种人:   *混日子,过一天算一天   这一种的我就不过多讨论了,没有什么意义。我

Java技术开发工程师的博客 373

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 446

【推荐100个unity插件之34】在unity中实现和Live2D虚拟人物的交互——Cubism SDK for Unity

Live2D是一款2D建模的软件,常用于游戏,动态壁纸,虚拟主播,游戏公司里面是有专门的ive2D岗位的。游戏里面还有一个经常使用的软件——spine,他做的也是2d的模型,但是他更适合做一些动作,Live2D更适合人物交互方面。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5000

阿里P8Java大神给迷茫的程序员一些中肯建议:“请不要再虚度光阴了!”

最近好多人私信问我,该怎样才能成为高薪架构师,还有一个就对当前的状态感到迷茫,我在此做一个简单的说明,或者对迷茫中的你来说有些许帮助。   当前你感到迷茫吗?   有很多人对现在的工作感到很没意思,因为当前的工作,完全是实现业务,技术上没有任何提高。在这种状态下就会感到迷茫,特别是一想到将来这种迷茫感就更强烈了。   与其说迷茫还不如说是担忧,随着时间的推移,自己的技术又没有长进,所以感觉忧心忡忡。   这里分为二种人:   *混日子,过一天算一天   这一种的我就不过多讨论了,没有什么意义。我

JavaBUGa的博客 1964

Transformer 面试题及详细答案120道(1-10)-- 基础概念

本文总结了Transformer模型的10个常见面试问题及答案,涵盖了其核心结构、创新点、工作机制等关键知识点。主要内容包括:Transformer的自注意力机制和多头注意力机制创新点,相比RNN/CNN的优势,模型在《Attention Is All You Need》论文中的提出背景,以及Encoder-Decoder协同工作流程等。重点解析了位置编码的作用、长距离依赖处理能力、与传统注意力机制的区别等核心问题。每个问题都给出了简明扼要的专业解答,适合作为Transformer相关面试准备的参考资料。

大剑师兰特的GIS世界 849

java架构师_JAVA架构师进阶之路很难?不,只是你没选对路

前言Java架构师是不少Java程序员的发展方向之一,也是从应用级程序员成长为研发级程序员所需要经历的重要阶段,所以了解Java架构师所需要的知识结构是比较重要的。通常所说的编程语言架构师都是从应用角度出发的,也就是说,Java架构师带领的开发团队多以应用级开发为主,工作的主要内容是基于平台进行的具体业务开发,比如采用Hadoop平台进行大数据应用开发,采用Spring框架进行Web开发等等。当前...

weixin_39985472的博客 158

超详细!Linux 服务器 6 大核心性能测试(附自动脚本 + 结果分析秘籍)---Linux 服务器性能测试文档

本文档旨在提供 Linux 服务器的 CPU、内存和磁盘性能测试方案,包括详细的测试大纲、操作步骤以及一键化测试脚本,帮助管理员快速评估服务器性能状况。通过以上测试方案,可以全面评估 Linux 服务器的 CPU、内存和磁盘性能,为系统优化、容量规划和问题排查提供重要参考依据。使用 sysbench 进行 CPU 基准测试。使用 sysbench 测试内存读写性能。使用 fio 工具进行更全面的磁盘测试。使用 dd 命令测试磁盘顺序读写性能。使用 dd 命令测试内存读写速度。记录磁盘 IO 性能。

jundao1997的专栏 381

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

工作一到三年的Java程序员感到迷茫?那是你没有找到正确的提升方式。阿里P8给你中肯的建议

最近好多人私信问我,该怎样才能成为高薪架构师,还有一个就对当前的状态感到迷茫,我在此做一个简单的说明,或者对迷茫中的你来说有些许帮助。 当前你感到迷茫吗? 有很多人对现在的工作感到很没意思,因为当前的工作,完全是实现业务,技术上没有任何提高。在这种状态下就会感到迷茫,特别是一想到将来这种迷茫感就更强烈了。 与其说迷茫还不如说是担忧,随着时间的推移,自己的技术又没有长进,所以感觉忧心忡忡。 ...

weixin_45127309的博客 653

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

搬砖 1-5年 的 Java 程序员,如何让自己的职业生涯更进一层楼?变得更值钱?

今天这篇文章主要想跟大家分享:搬砖 1-5年 的 Java 程序员,如何让自己的职业生涯更进一层楼?如何变得更值钱? 如果你现在已经是一个 Java 工程师,但是经验积累的还不够,那这个阶段就是你成长极快的时候。前提是,你认同我之前经常说那句话:从你入行那一刻起,你就要不停地学习。 对于 Java 工程师来说,想在业务能力上更进一步、让自己更值钱,最大的捷径就是用正确的方法来学习,好的方法能让你事半功倍。 我面试过多人,之前也在大厂待过,深知一个道理:作为一个程序员,你的知识体系,和企业的用人需求,是

mifffy_java的博客 350

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

搬砖 1-5年 的 Java 程序员,如何让自己的职业生涯更进一层楼?

今天这篇文章主要想跟大家分享:搬砖 1-5年 的 Java 程序员,如何让自己的职业生涯更进一层楼?如何变得更值钱? 如果你现在已经是一个 Java 工程师,但是经验积累的还不够,那这个阶段就是你成长极快的时候。前提是,你认同我之前经常说那句话:从你入行那一刻起,你就要不停地学习。 对于 Java 工程师来说,想在业务能力上更进一步、让自己更值钱,最大的捷径就是用正确的方法来学习,好的方法能让你事半功倍。 我面试过多人,之前也在大厂待过,深知一个道理:作为一个程序员,你的知识体系,和企业的用人需求..

m0_60478027的博客 221

五年数据库专家,深入剖析高性能MySQL架构系统,不来后悔一辈子

前言 和其他数据库系统相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥好的作用,但同时也会带来一点选择上的困难。MySQL并不完美,却足够灵活,能够适应高要求的环境,例如Web类应用。同时,MySQL既可以嵌入到应用程序中,也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统(OLTP)等各种应用类型。 成为一名架构师几乎是所有程序员的梦想,然而在这大数据时代,少了MySQL数据库的架构系统,也是不会有前途的~~~ 今天, 小编就带来一篇高性能MyS.

python6_quanzhan的博客 2407

十年数据库专家,呕心力作MySQL技术精粹,薪资直涨3K其实很轻松

前言 MySQL是最流行的关系型数据库管理系统之一, 在Web应用方面,MySQL是最好的RDBMS ( Relational Database Management System,关系数据库管理系统应用软件。 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的SQL语言是用于访问数据库的最常用的标准化语言MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤

python6_quanzhan的博客 1881

程序员如何高效提升学习能力?做到这三点,你就会与众不同

前言 众所周知,现在是一个知识爆炸的时代,知识更新非常快。据测算,一个大学毕业生所学到的知识,在毕业之后2年内,有效的不过剩下5%。对于软件行业而言,这种形势更为明显,我们赖以立足的,不在于我们现在掌握了多少知识,而是我们有多强的学习能力。 互联网时代,IT技术的发展日新月异,新技术层出不穷,具有良好的学习能力,能及时获取新知识、随时补充和丰富自己,已成为程序员职业发展的核心竞争力。本文中,笔者不谈代码理论,只是结合多年的学习经验,一起分享下提高程序员学习能力的三个要点。 要善于读书 .

python6_quanzhan的博客 1639

Redis为什么这么快?一文带你深入理解Redis单线程分析

redis为什么那么快?结论有三点,大家都知道,这里主要是分析。 首先第一点 redis是内存访问的,所以快 当然这个大家都知道,所以不是重点 IO密集型和CPU密集型 一般我们把任务分为io密集型和cpu密集型 IO密集型 IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。 对于io密集型的任务,它的主要时间都在磁盘io上,而io本身在发出中断告知cpu后...

python6_quanzhan的博客 903

阿里P8重点推荐的火爆全网MySQL路线笔记,啃完吃透保你涨薪5K

什么是数据库 简单来说,所谓的数据库就是存储数据的容器,而且是永久存储的。 2、为什么需要数据库 3、为什么要学习MySQL数据库 MySQL由于免费,而且性能强劲,是目前使用最广泛的数据库产品,同时也是入门门槛最低的数据库产品之一,更重要的是,以MySQL为学习原型,以后去适应和掌握其他数据库产品,思想和原理都是互通的,也不会有太大障碍。 几乎任何一个企业级应用,都要用到数据库。 无论开发、测试、运维还是架构师,数据库都是加分神器! 小的软件企业分工不明确,全能型人才能得到更多的机.

python6_quanzhan的博客 842

不喜勿喷!MySQL调优实战经验总结,扫平你的数据库开发障碍

前言 MySQL 数据库的使用是非常的广泛,稳定性和安全性也非常好,经历了无数大小公司的验证。仅能够安装使用是远远不够的,MySQL 在使用中需要进行不断的调整参数或优化设置,才能够发挥 MySQL 的最大作用。下面就是我在工作中经验的总结,也作为自己的工作笔记,如果能够帮助到有需要的朋友就更好了。MySQL 的优化可以从以下方面来做: 架构层面 1、做主从复制。 2、实现读写分离。 3、分库分表。 系统层面 1、增加内存。 2、硬盘使用固态硬盘 SSD。 3、给磁盘做 raid0 或者.

python6_quanzhan的博客 705

阿里第九版Java系统架构师+应用架构师面试突击宝典

大致目录 下面这张图是这个PDF的大致内容,详细内容的话在这里为大家展开有点不切合实际,下面也将会为大家截图部分的内容! 还是那句话,受限于文章的篇幅问题,里面详细的知识点就不给大家截图打开了! 多线程部分内容 什么是线程死锁?如何避免死锁? JVM部分部分内容 说⼀下堆内存中对象的分配的基本策略 计算机网络部分的内容 算法部分内容 MySQL部分内容 Redis部分内容 系统设计的部分内容 ...

python6_quanzhan的博客 676
上一篇: Redis为什么这么快?一文带你深入理解Redis单线程分析
下一篇: 循序渐进学MySQL,数据库的基本操作,助你实战出真知
Java领域指导者
博客等级 码龄7年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值