在 MySQL 事务中,什么时候释放锁?

IO多路转接 ——— select、poll、epoll select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用 阅读详情

事务获得锁之后,哪些情况下会释放锁?本期我们聊聊这个主题。

作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

1. 概述

InnoDB 事务执行过程中,加表锁或者行锁之后,释放锁最常见的时机是事务提交或者回滚即将完成时。

因为事务的生命周期结束,它加的锁的生命周期也随之结束。

有一种情况,加锁只是权宜之计,临时为之。如果这种锁也要等到事务提交或者回滚即将完成时才释放,阻塞其它事务的时间也可能更长,这就有点不合理了。所以,这种锁会在事务运行过程中及时释放。

还有一种情况,虽然是在事务提交过程中释放锁,但是并不会等到提交即将完成时才释放,而是在二阶段提交的 prepare 阶段就提前释放。

最后,有点特殊的就是 AUTO-INC 锁了。

2. 不匹配 where 条件

我们先来看看只是权宜之计的加锁场景。

select、update、delete 语句执行过程中,不管 where 条件是否命中索引,也不管是等值查询还是范围查询,只要扫描过的记录,都会加行锁。

和 update、delete 不一样,select 只在需要加锁时,才会按照上面的逻辑加锁。

可重复读(REPEATABLE-READ)、可串行化(SERIALIZABLE)两种隔离级别,只要加了锁,不管是表锁还是行锁,都要等到事务提交或者回滚即将完成时才释放(手动加的表锁除外)。这就是我们前面说的释放锁最常见的时机了。

读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别,如果发现记录不匹配 where 条件,会及时释放行锁。这又分为两种情况。

情况 1,如果部分或者全部 where 条件下推到了存储引擎,InnoDB 每读取一条记录,都会判断记录是否匹配下推的 where 条件。

情况 2,server 层每次收到 InnoDB 返回的一条记录,也会判断记录是否匹配 server 层的 where 条件。

以上两种情况,只要记录不匹配 where 条件,就会马上释放当前 SQL 语句对记录加的行锁(其实有个例外情况,稍后介绍)。

这里释放行锁,只会释放不匹配 where 条件的这一条记录上的行锁,过程也比较简单,就是把行锁结构的 bitmap 内存区域中,这条记录对应的位设置为 0。

如果有其它事务正在等待获得这条记录的行锁,还会根据行锁的授予规则,给其它事务授予锁。

前面提到有一个例外情况,现在,该它出场了。

如果事务对某条记录加行锁,没有立即获得锁,而是进入了锁等待状态,等其它事务释放锁之后才获得锁。InnoDB 或者 server 层发现这条记录不匹配 where 条件,并不会释放它的行锁。

这是为什么呢?

因这经过锁等待状态之后才获得的行锁,事务就不知道是哪条 SQL 语句执行时给加的行锁了,所以,即使发现记录不匹配 where 条件,也不会释放它的行锁。

3. prepare 阶段

读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别下:

  • select、update、delete 语句全表扫描、索引范围扫描过程中,只会对索引记录加普通记录锁,不会加间隙锁和 Next-Key 锁。
  • 外键约束检查、重复值检查这两个场景下,还是会对索引记录加间隙锁或者 Next-Key 锁的。

这两种隔离级对索引记录前面间隙的锁定,不需要等到事务提交或者回滚即将完成时才释放,在事务二阶段提交的 prepare 阶段就可以提前释放。

Next-Key 锁既锁定索引记录本身,又锁定索引记录前面的间隙。

如果释放索引记录的 Next-Key 锁,就意味着释放了索引记录本身和前面间隙的锁定,这显然是不行的,因为索引记录本身的锁定,要等到事务提交或者回滚即将完成时,才能释放。

那么,Next-Key 锁要怎么释放?

稍安勿躁,我们一起来看。

释放索引记录前面间隙的锁定,需要遍历事务对象的 trx_locks 链表,遍历过程中,每次取一个锁结构(可能是表锁结构或者行锁结构)。

如果锁结构对应的是间隙锁,直接释放索引记录上的间隙锁,主要流程如下:

  • 从事务对象的 trx_locks 链表中删除行锁结构。
  • 从 rec_hash 的数组中找到锁结构所在的行锁结构链表,然后从链表中删除锁结构。
  • 锁结构的 bitmap 内存区域中,可能有一个或者多个位的值为 1,这些位对应的记录都被加了间隙锁。如果有其它事务正在等待获得这些记录上的行锁,根据行锁的授予规则,给这些事务授予锁。

如果锁结构对应的是 Next-Key 锁,只释放索引记录前面间隙的锁定,保留索引记录本身的锁定,主要流程如下:

  • 给锁结构的 type_mode 属性加上 LOCK_REC_NOT_GAP 标志,也就是直接把 Next-Key 锁变成了普通记录锁。
  • 锁结构的 bitmap 内存区域中,可能有一个或者多个位的值为 1,这些位对应的记录都被加了 Next-Key 锁,现在都变成了普通记录锁。如果有其它事务想往这些记录前面的间隙插入记录被阻塞了,现在就可以根据行锁的授予规则,给这些事务授予插入意向锁了。

4. 事务提交或回滚

事务加行锁的共享锁、排他锁之前,会分别加表级别的意向共享锁、意向排他锁,这两种表锁都要到事务提交或者回滚即将完成时才释放。

事物加的所有行锁,除了读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别已经释放的不匹配 where 条件的记录上的行锁、索引记录前面间隙的锁定之外,剩下的行锁,都要等到事务提交或者回滚即将完成时才释放。

事务提交或者回滚事务即将完成时,释放表锁和行锁需要遍历 trx_locks 链表,遍历过程中,每次取一个锁结构。

对于行锁结构,释放锁的主要流程如下:

  • 从事务对象的 trx_locks 链表中删除行锁结构。
  • 从 rec_hash 的数组中找到锁结构所在的行锁结构链表,然后从链表中删除行锁结构。
  • 锁结构的 bitmap 内存区域中,可能有一个或者多个位的值为 1,这些位对应的记录都被加了某种行锁。如果有其它事务正在等待获得这些记录上的行锁,根据行锁的授予规则,给这些事务授予锁。

对于表锁结构,释放锁的主要流程如下:

  • 从事务对象的 trx_locks 链表中删除表锁结构。
  • 从表对象的 locks 链表删除表锁结构。
  • 如果有其它事务正在等待获得这个表的表锁,根据表锁的授予规则,给这些事务授予锁。

5. AUTO-INC 锁

把 AUTO-INC 锁单独拿出来说,是因为它有点特殊。

前面介绍 InnoDB 表锁时,我们介绍过,AUTO-INC 锁有两种类型,一种是轻量锁,这其实只是个互斥量。

另一种才是真正的表级别的 AUTO-INC 锁,它会创建表锁结构,和表级别的意向共享锁、意向排他锁一样,都属于表锁。

AUTO-INC 锁的这两种类型,释放时机不同。

轻量锁,用完就释放,也就是 insert 或者 update 语句获取到自增列的自增值之后,就可以释放了。

因为这种类型,只是个互斥量,释放也很简单,调用释放互斥量的方法就可以了。

此时,可能有其它事务正在等待获得这个表的轻量 AUTO-INC 锁,也就是等待获得这个互斥量,由操作系统决定哪个事务能获得这个互斥量。

真正的表级别的 AUTO-INC 锁,要等到加锁的 SQL 语句执行完成才释放,主要流程如下:

  • 从事务对象的 autoinc_locks 数组中删除表锁结构。
  • 从事务对象的 trx_locks 链表中删除表锁结构。
  • 从表对象的 locks 链表中删除表锁结构。
  • 如果有其它事务正在等待获得这个表的 AUTO-INC 锁,根据表锁的授予规则,给这些事务授予锁。

6. 总结

事务执行过程中加的表锁,都要等到提交或者回滚即将完成时才释放(手动加的表锁除外)。

事务执行过程中加的行锁,根据事务隔离级别的不同,释放时机不同。

可重复读(REPEATABLE-READ)、可串行化(SERIALIZABLE)两种隔离级别,事务加的所有行锁,都要等到提交或者回滚即将完成时才释放。

读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别,事务加的行锁,释放时机不同。

  • 对于不匹配 where 条件的记录,发现不匹配之后,server 层或者 InnoDB 就会释放这些记录的行锁。
  • 对于间隙锁或者 Next-Key 锁,在二阶段提交的 prepare 阶段,会释放记录前面间隙的锁定,保留记录本身的锁定。
  • 剩余未释放的行锁,都要等到事务提交或者回滚即将完成时才释放。

AUTO-INC 锁有两种类型,对应两种释放时机:

  • 轻量锁,用完就释放。
  • 真正的表级别的 AUTO-INC 锁,加锁的 SQL 语句执行完成时释放。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

C# 调用高德地图关键词 API 今天我们要一起探索如何使用 C# 来调用高德地图的关键词搜索 API,从而实现精准的地理位置搜索功能。高德地图的关键词搜索 API 可以帮助我们轻松地实现这一点,它能够返回一系列匹配关键词的地点坐标和其他相关信息。通过简单的几行 C# 代码,我们就实现了调用高德地图关键词搜索 API 的功能。接下来,我们将在一个 C# 控制台应用中实现调用高德地图关键词搜索 API 的功能。此外,如果要在生产环境中使用,还需要考虑安全性问题,例如不要在客户端暴露 API 密钥。🔥关注墨瑾轩,带你探索编程的奥秘! 阅读详情

相关推荐

BEVFormer详解

BEVFormer 是将Transformer架构的自注意机制与BEV视图中3D检测结合起来的一种纯视觉目标检测方案。对于纯视觉的BEV检测方案,其中的重中之重就是如何将2D的图像特征映射到3D空间的BEV栅格,既然是映射关系,那就有前行投影和反向查询两种机制。前向投影是基于深度估计的方法,参考基于深度估计的BEV视图转换方法,典型代表为LSS。反向查询方法思路为先将BEV栅格在Z方向上进行lift提升,然后再映射到图像特征图上进行特征查询。BEVFormer 就是基于这种机制进行2D图像特征到3D空间的B

MAX的专栏 4745

mysql事务锁手动释放

1:查看数据库当前的进程,这个命令可以列出当前库所有的线程 mysql> show processlist; 2:查看当前的事物情况 2-1:查询当前数据库运行的所有事物 mysql> SELECT * FROM information_schema.INNODB_TRX; 2-2:查询当前数据库出现的锁 mysql> SELECT * FROM information_schema.INNODB_LOCKs; 2-3:...

dark_horse_lk的博客 2325

python怎样按某一列值拆分Excel表格

pd.ExcelWriter@python #用python按某一列拆分Excel工作表,将内容写入一个工作簿 本次以“按照表中的某一列,将一张表格拆分为多张表”的需求为例,简单介绍这个过程中用到的pd.ExcelWriter,及每一句的作用。 如上表《学生.xlsx》,假设有14万行28列,请按照学校名,拆分表格(不想用复制粘贴)。 ##代码及解释如下 import pandas as pd from time import time#用来计算时间,展示进度,减少焦虑 in_ws='学生.xlsx'#

learn_get的博客 6786

聊聊Mysql事务中,如何释放锁

在 MySQL 中,事务的锁是在事务结束时释放的。锁用于确保数据的一致性和完整性,防止多个事务同时修改同一数据导致冲突。COMMITCOMMITROLLBACKROLLBACK在关闭自动提交模式后,你需要手动使用COMMIT或ROLLBACK来结束事务并释放锁。

vangoghlaam的博客 938

STM32F407ZGT6开发板跑马灯实战:从原理图到烧录全流程(附FlyMcu配置)

本文以正点原子F4探索者开发板(STM32F407ZGT6)为例,手把手指导完成跑马灯实验。内容涵盖从原理图解读、GPIO驱动逻辑分析、HAL库工程搭建,到代码编写与FlyMcu串口烧录配置的全流程,帮助嵌入式开发新手快速实现第一个LED控制程序,打通软硬件开发链路。

weixin_29183637的博客 223

【Python】秋招机考 —— 2025/9/17 华为 AI 方向

秋招机考,华为 AI,使用 Python 完成编程。

一杯水果茶!足矣~ 1166

MySQL数据库锁表,如何释放锁

数据库锁表,运行的程序开始报错问题出现原因解决办法总结 问题出现原因 项目中某个表的数据太多而且无效,影响用户使用体验,计划用sql语句进行删除,然后手写sql进行删除数据操作,之后发现这个sql执行的时间比较长,然后进行停止操作。之后就出现了关联表被锁的现象,导致程序置行update操作报错。 解决办法 重启数据库(不推荐) 当时项目还在生产运行,出现这个问题也比较棘手,当时拿着报错去百度,没找到立即解决的办法。无奈只能尝试重启数据库的方式来解决问题。 通过查看数据库锁情况来kill进程来解决问题。

黑不只是一种颜色 9183

8.26华为OD机试真题 新系统 - 字符串回文判 (Java/Py/C/C++/Js/Go)

8.26华为OD机试真题 新系统 - 字符串回文判 (Java/Py/C/C++/Js/Go)

算法大师! 1236

MySQL数据库查看是否锁表以及如何解决

近期系统在使用过程中总是出现数据库锁表情况,导致页面报错,经过排查,是由于系统在跑定时任务;将解决过程以及在以后开发过程中该怎样注意,做个总结,避免以后在出现;

似水流年,是谁苍白了等待 3万+

【定位模块算法】amcl(蒙特卡洛)粒子滤波定位算法(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言(1)amcl定位框架介绍(2)amcl定位框架组成(1)ROS-TF坐标转换树【ROS的工具】(2)robot_pose_ekf扩展卡尔曼位姿估计算法(3)定位amcl自适应蒙特卡洛定位,adaptive monte carlo localizaion**(3)amcl定位节点的订阅与发布(4)amcl定位功能包用法(1)编写amcl节点相关的launch(amcl_omni.l

qq_35635374的博客 4403

【CUDA编程部署教程】第一章:GPU架构与CUDA编程核心 1

我们将剖析现代GPU的计算心脏——流式多处理器(SM),理解其独特的Warp执行模型,探索Tensor Core带来的革命性矩阵运算加速,并深入探讨决定性能命脉的内存体系。当必须访问全局内存时,则必须遵循**合并访问(Coalesced Access)**的原则,即让一个Warp内的32个线程访问连续的内存地址,从而让硬件将多次访问合并为一次高效的内存事务,以充分利用带宽。SM的调度器以Warp为单位分派指令,在一个Warp内,所有32个线程在同一时刻执行完全相同的指令,但处理的数据不同,这种模型被称为。

VectorShift的博客 221

MySQL数据库学习日志(七):锁机制

MySQL数据库学习日志(七):锁机制 MySQL数据库学习日志(七):锁机制锁机制锁的概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁/临界锁补充一下相关知识:end 锁机制 锁的概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要

张小憨憨的博客 1443

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1403

mysql事务没有提交会释放锁吗

在 MySQL 中,事务未提交时会保留对行锁的占用,并不会释放。事务在提交或回滚后才会释放行锁。 在 MySQL 中,事务是通过回滚操作来释放行锁的。回滚操作不仅会释放行锁,还会撤销事务中所有的修改操作,使数据库恢复到事务开始之前的状态。 如果在 MySQL 中,事务未提交却被强制终止(例如,因为连接断开或服务器关闭),则 MySQL 会自动回滚事务,释放行锁。 ...

weixin_35756892的博客 1129

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python 释放mysql的锁_python 多人连接mysql 进行事务操作 对mysql加锁与释放锁

python 多人连接mysql 对mysql进行事务操作 对mysql加锁与释放锁下面这个是user1代码块# -*- coding: utf-8 -*-# user1import pymysqlimport timeconn = pymysql.connections.Connection(host="localhost", user='debian-sys-maint', password=...

weixin_39867296的博客 633

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mysql事务没有提交会释放表锁和行锁中的表锁吗

是的,如果 MySQL 事务没有提交,那么会释放表锁。但是行锁不会被释放,因为行锁只在当前事务内有效,事务结束后会自动释放。 举个例子,如果你在一个事务中执行了 SELECT ... FOR UPDATE 语句来对一行加行锁,那么在这个事务未提交之前,其他事务无法访问这一行。但是如果你在这个事务中使用了 LOCK TABLES 语句来加表锁,那么即使事务未提交,其他事务也无法访问这张表。 ...

weixin_42583683的博客 1171

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MySQL锁释放时机(事务)

在事务执行过程中,如果有加锁操作,这个锁需要等事务提交时释放。 时间线 事务1 (T1) 事务2(T2) t1 BEGIN; BEGIN; t2 UPDATE lockdemo SET state = '666' WHERE id = 2; t3 UPDATE l...

东境物语 1万+

Mysql事务:释放当前锁

查看当前运行事务: SELECT a.trx_id, a.trx_state, a.trx_started, a.trx_query, b.ID, b.USER, b.DB, b.COMMAND, b.TIME, b.STATE, b.INFO, c.PROCESSLIST_USER, c.PROCESSLIST_HOST, c.PROCESSLIST_DB, .

weixin_38289303的博客 1111

Mysql 8手动终止某个事务并释放其持有的锁

是可以执行的,再去数据表看最新数据发现,刚这个事务没有提交的数据变更是没有生效的。这是由innodb的原子性保障了,要么事务提交成功,所有变更生效,要么事务未提交事务内所有变更都不生效。持有了行记录3的排它锁,且无间隙锁,锁类型是行锁,额外还获得了表锁的意向排他锁(意向跑排他锁不等于持有排它锁,只是表达一个意向,并没有持有这个表级排它锁)在mysql数据库里的information_schema.INNODB_TRX表中存储有innodb的所有事务,我们可以查看该表来查看正在进行的事务。

HumorChen的博客 2047

mysql释放锁_mysql释放锁时机跟踪

近几年学得比较迷茫,好像什么都学,一直想好好剖析一个好产品,好好提升一下自我,好像进展蛮慢,博客也少写了。人的精力是有限的,还是得在某一行深入。近来对mysql有些兴趣,专门学习了一下。我们都知道,数据库事务隔离级别下和普通sql加锁和释放锁的时机是不同的,mysql是如何实现的呢。(以mysql-6.0.11-alpha为例)mysql锁释放的代码在 lock_release_off_ker...

weixin_30982943的博客 742

MySQL如何释放锁还是自动释放锁?

MySQL锁释放机制详解 MySQL锁释放分为自动和手动两种情况。自动释放场景包括:1)事务提交/回滚时;2)会话结束;3)语句执行完成(自动提交模式);4)锁等待超时;5)死锁检测后。需要手动释放的锁包括表级锁、全局读锁和命名锁。不同锁类型的释放机制各异:InnoDB行级锁在事务结束时释放,而元数据锁在DDL完成后释放。可通过performance_schema查看锁状态,使用KILL命令强制释放锁。最佳实践包括保持事务简短、统一访问顺序和监控长事务。特殊场景下需处理大事务和死锁问题。合理控制事务大小和隔

"代码"的日常搬运 2221

mysql释放锁_mysql锁释放时机(二)

上篇,跟踪了select在事务和非事务下的调用路径,本次跟踪insert下的执行路径。insert into test1(aa) values('hello world');断点显示的堆栈#0 lock_release_off_kernel (trx=0xb512ac68) at lock/lock0lock.c:3853#1 0xb5dca803 in trx_commit_off_kern...

weixin_39863759的博客 1201

mysql排他锁释放_Mysql 共享锁、排他锁 与 事务隔离级别详解

共享锁、排他锁InnoDB 实现了两种类型的锁机制:共享锁(S)和排他锁(X)。共享锁允许一个事务读数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁;排他锁是修改数据时加的锁,可以读取和修改数据,一旦一个事务对该行数据加锁,其他事务将不能再对该数据加任务锁。共享锁(S)排它锁(X)共享锁(S)允许不允许排它锁(X)不允许不允许x轴:事务A拥有的锁y轴:事务B申请的锁注:一个事务在某一...

weixin_42130889的博客 958

测试MySQL的事务加锁等待和锁释放

本文测试的是数据行锁,请确保表存储引擎在InnoDB的状态下,测试的数据库事务隔离级别为可重复度。 1. 初始表结构和数据如下 2. 分别打开两个查询窗口(就是等下会开启两个不同的事务) 在第一个窗口中先执行前两句代码,对第一行数据加锁 执行第二个窗口的代码,会发现下面的更新语句一直在等待 运行第一个窗口的第三行代码,提交第一个事务,可以看到第二个窗口的更新语句才执行完成。 3. 演示部...

黑夜开发者的博客 1820

mysql 锁表会自动释放吗

我整理的一些关于【MySQL,SQL】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://edu.51cto.com/surl=QDW3g3MySQL 锁表会自动释放吗? 在 MySQL 的日常使用中,锁的概念至关重要。锁用于保证数据库操作的安全与一致性,尤其在并发环境下,能够有效防止数据的竞争条件。然...

weixin_36992150的博客 354

python 多人连接mysql 进行事务操作 对mysql加锁与释放锁

python 多人连接mysql 对mysql进行事务操作 对mysql加锁与释放锁 下面这个是user1代码块 # -*- coding: utf-8 -*- # user1 import pymysql import time conn = pymysql.connections.Connection(host="localhost", user='debian-sys-maint...

weixin_43903378的博客 6255
上一篇: MySQL5.7 中连续 Crash 引发 GTID 丢失
下一篇: OceanBase 日志盘过小也会导致创建租户失败?
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值