MySQL8表级锁

深入解析MySQL锁机制:从原理到避坑指南 在高并发数据库场景中,锁机制是保障数据一致性的核心,也是导致性能问题的常见根源。本文将全面剖析MySQL中各类锁的工作原理,通过真实案例揭示锁冲突的解决方案,并给出性能优化实践建议。 阅读详情

MySQL 8.0.34

MySQL8表级锁

MySQL中表级锁主要有表锁(注意区分表级锁)、意向锁、自增锁、元数据锁。

表锁

表锁是一种表级锁,他是一种显式锁,通常需要用户手动加锁和解锁(也存在特殊情况,比如行级锁升级为表级别),表锁分为两种,一种是读锁(S锁),一种是写锁(X锁),只能在一个会话中加锁和解锁,不能获取其他会话的锁以及释放其他会话的锁。表锁不仅仅能锁定表,也能锁定视图。

语法说明

加锁和解锁的语法如下:

# 加锁
LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...
    
# 锁类型
lock_type: {
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE
}
# 解锁
UNLOCK TABLES

LOCOL:他的作用是在满足MySIAM表并发插入条件的情况下,允许其他用户在表尾并发插入记录。

LOW_PRIORITY :代表低优先级,已过期,后续版本中会删除,因为WRITE锁通常具有更高的优先级 比锁,以确保尽快处理。

表锁的兼容性如下:

当前锁/其他锁读锁写锁
读锁兼容互斥
写锁互斥互斥

也就是说,多个客户端可以对同一个表同时加读锁,但是不能同时加写锁,或者混合读写锁,举例说明:


兼容性验证

读锁和读锁

打开两个会话,同时对一个表加上表读锁。

image-20230720220956460

查看锁状态,通过show open tables from d1查看数据库d1的表的锁状态。

image-20230720221052789

因为两个会话都对表t1加了表读锁,所以In_use字段的值为2。

当然也可以同时对多个表进行加锁

image-20230721105804168

使用unlock tables解锁。


读锁和写锁

image-20230720221332999

image-20230720221434832

查看锁状态:

image-20230720221614025

可以看到只加上了一把锁,并且无论先加表读锁还是表写锁都没有关系,后加的锁都无法成功加锁,一直阻塞中,只有当之前的锁解锁后,后面的加锁语句才能成功。

使用unlock tables解锁。


写锁和写锁

image-20230720221849883

可以确认写锁和写锁是排斥的。

使用unlock tables解锁。


通过FLUSH语句加表锁

还有一种加表锁的方式,就是使用FLUSH TABLES tbl_name [, tbl_name] … WITH READ LOCK,此语句会首先获取一个指定表的排他锁,因此他会等待这些表的事务完成,然后刷新这些表的表缓存,重新打开表,最后获取表锁(读取),接下来再将元数据排他锁降级为元数据共享锁,那么其他会话就只能读取表而不能修改表。

image-20230721110941973

上图中我使用FLUSH TABLES tbl_name [, tbl_name] … WITH READ LOCK语句对t1加了锁,然后我通过show open tables from t1查询了打开的表,是能查到结果的(此处不用管t2表,因为也没操作t2表。),我们知道flush的作用是清理缓存并关闭表,此处能查到恰巧说明了该语句又重新打开了表。

上面我们提到了元数据锁的概念,此处只需要知道它的作用是维护表元数据的一致性,为了避免DML与DDL冲突,保证读写的正确性。

无论使用LOCK TABLSES还是使用FLUSH TABLES tbl_name WITH READ LOCK都会加上元数据锁,我们查看下元数据锁的表查看下。

image-20230721112531426

image-20230721112633809

解锁方式

上面我们已经说明通过UNLOCK TABLES可以手动解锁,除了此种方式还有其他的解锁方式。

  1. 断开会话

    会话断开会自动释放表锁,验证下(这里我通过写锁和写锁的互斥性来验证)。

    image-20230721111852205

    当会话1中断开MySQL的连接,会话2则不再阻塞,加锁成功。

  2. 开启事务

    当前加了表锁,但是当开启事务的时候,会自动解锁。

    image-20230721112258652

元数据(MDL)锁

概念

元数据锁(Metadata Lock,简称MDL)是表级锁中的一种,MDL锁主要作用是维护表元数据的数据一致性,为了避免DML与DDL冲突,保证读写的正确性。

元数据锁不仅仅可以应用到表上,也可以应用到schemas、存储过程、函数、触发器、计划事件、表空间上。

隐式加解锁,无需用户控制,系统自动完成。

DDL、DML、DQL以及表级锁都会加元数据锁。

查看MDL锁

我们可以通过PERFORMANCE_SCHEMA中的metadata_locks查看锁情况

image-20230721120103466

因为我们查询了metadata_locks表,所以系统自动加了元数据锁,查询也加锁吗?是的。

列解释:

列名解释
OBJECT_TYPE当前锁类型:取值有GLOBAL,SCHEMA,TABLE,FUNCTION,PROCEDURE,TRIGGER,EVENT,COMMIT,USER LEVEL LOCK,TABLESPACE,LOCKING SERVICE
OBJECT_SCHEMA对象所在的SCHEMA名字
OBJECT_NAME对象名称
LOCK_TYPE锁的具体类型,取值有:INTENTION_EXCLUSIVE,SHARED,SHARED_HIGH_PRIO,SHARED_READ,SHARED_WRITE,SHARED_UPGRADABLE,SHARED_NO_WRITE,SHARED_NO_READ_WRITE,EXCLUSIVE,
LOCK_STATUS锁的状态,取值有:PENDING,GRANTED,VICTIM,TIMEOUT,KILLED,PRE_ACQUIRE_NOTIFY,POST_RELEASE_NOTIFY

MDL锁种类

MDL锁的种类主要分为共享只读锁SHARED_READ_ONLY,共享写锁SHARED_NO_READ_WRITE,共享读锁SHARED_READ,共享写锁SHARED_WRITE,排他锁EXCLUSIVE。

有些奇怪呀?常见共享锁和排他锁的规则是读读兼容,读写、谢谢排斥嘛,这里为什么共享写锁?在MDL锁中这确实是比较特殊的存在,在MDL锁中,共享读锁(SHARED_READ)和共享写锁(SHARED_WRITE)确实是兼容的,他们跟排他锁EXCLUSIVE是互斥的。

DQL

DQL主要包含普通SELECT快照读,同时也可以针对SELECT加锁实现最新读。

首先看下SELECT快照读,会加什么样的元数据锁。

SELECT快照读,元数据锁演示

可以看到对于DQL快照读会加上元数据锁中的SHARE_READ锁,叫做元数据共享读锁。

再看下使用SELECT ... FROM TABLE FOR SHARE/UPDATE语句会加上什么锁。

FOR SHARE:

FOR SHARE

可以看到对于SELECT ... FOR SHARE语句加上了SHARE_READ锁,这跟不使用FOR SHARE是意向的效果。

FOR UPDATE:

FOR UPDATE

对于SELECT ... FOR UPDATE语句,加上了元数据锁中的共享写锁(SHARED_WRITE)。

通过上面可以知道对于不同的DQL加的元数据锁的类型:

语句(DQL)MDL锁类型说明
SELECT、SELECT…[FOR SHARELOCK IN SHARE MODE]共享读锁(SHARED_READ)
SELECT…FOR UPDATE共享写锁(SHARED_WRITE)对于加了排他锁的SELECT语句说,会加MDL共享写锁。

上面我们提出来为什么共享读和共享写是兼容的,到这里其实我们就能够理解了,比如针对一个表有如下两个语句操作。

  1. SELECT * FROM t1 WHERE id = 1;
  2. SELECT * FROM t1 WHERE id = 2 FOR UPDATE;

对同一个表id不同的两个语句执行了两种查询,每种查询都会创建元数据锁,但是两个SQL创建的锁是不同的。


表锁

给一张表加表锁的同时系统也会加上元数据锁。

image-20230721122647389

加表级读锁的时候,系统会自动创建一个共享MDL读锁


image-20230721122858729

加表级写锁的时候,系统会自动创建一个MDL写锁(SHARED_NO_READ_WRITE) 。


DML

看下DML中INSERT,UPDATE,DELETE语句会加什么样的MDL锁。

image-20230721174057199

可以看到对于INSERT操作,系统加上了MDL共享写锁(SHARED_WRITE),验证完毕提交事务。

image-20230721174326691

对于UPDATE操作,系统也是加上了MDL共享写锁(SHARED_WRITE),验证完毕提交事务。

image-20230721174613619

对于DELETE操作,也是加上了MDL共享写锁(SHARED_WRITE),验证完毕提交事务。

总结:

语句种类(DML)MDL锁类型
INSERT、UPDATE、DELETESHARED_WRITE

DDL

对于DDL语句,系统会自动加上MDL排他锁(EXCLUSIVE),此排他锁会阻塞所有的DQL、DML以及其他的DML。


总结:通过上面的例子我们可以得到如下结论。

SQL命令锁类型
SELECT、SELECT…[FOR SHARELOCK IN SHARE MODE]SSSHARE_READ
INSERT、UPDATE、DELETE、SELECT…FOR UPDATESHARE_WRITEMDL共享写
ALTER TABLE、CREATE INDEX等DDL语句EXCLUSIVEMDL排他锁
LOCK TABLES 表明 READ/WRITESHARED_READ_ONLY/SHARED_NO_READ_WRITE共享只读锁/共享只写锁

MDL锁类型兼容性

上面介绍了针对不同的SQL命令所加的MDL所类型,接下来查看各种锁类型的兼容性。

  1. SHARE_READ和SHARE_READ
  2. SHARE_READ和SHARE_WRITE
  3. SHARE_READ和EXCLUSIVE
  4. SHARE_READ和SHARED_READ_ONLY
  5. SHARE_READ和SHARED_NO_READ_WRITE
  6. SHARE_WRITE和SHARE_WRITE
  7. SHARE_WRITE和EXCLUSIVE
  8. SHARE_WRITE和SHARED_READ_ONLY
  9. SHARE_WRITE和SHARED_NO_READ_WRITE
  10. EXCLUSIVE和SHARED_READ_ONLY
  11. EXCLUSIVE和SHARED_NO_READ_WRITE

SHARE_READ和SHARE_READ

image-20230721192257982

SHARE_READ和SHARE_READ是兼容的,再查看下此时MDL锁情况。

image-20230721192400027


SHARE_READ和SHARE_WRITE

image-20230721191910087

可以看到未阻塞,再查看下MDL锁情况。

image-20230721192105467

可以看到确实是有两个MDL锁。

SHARE_READ和EXCLUSIVE

image-20230721192755621

查看锁情况:

image-20230721210438885

可以看到MDL排他锁的状态是PENDING,所以SHARE_READ和EXCLUSIVE是互相排斥的。

SHARE_READ和SHARED_READ_ONLY

image-20230721210900711

查看你下此时的加锁情况:

image-20230721210948331

可以看到都获取到了锁,所以SHARE_READ和SHARED_READ_ONLY是兼容的。

SHARE_READ和SHARED_NO_READ_WRITE

image-20230721211208668

查看下锁信息:

image-20230721211244376

可以看到是状态是PENDING,所以SHARE_READ和SHARED_NO_READ_WRITE是排斥的。

SHARE_WRITE和SHARE_WRITE

image-20230721212228012

查看MDL锁情况:

image-20230721212312695

可以看到两个MDL共享读锁确实是兼容的。

SHARE_WRITE和EXCLUSIVE

image-20230721212615411

查看下MDL锁情况:

image-20230721212700001

从锁状态上看,也是EXCLUSIVE状态是PENDING,说明SHARE_WRITE和EXCLUSIVE是排斥的。

SHARE_WRITE和SHARED_READ_ONLY

image-20230721212959706

查看MDL锁信息:

image-20230721213037832

两图一直,处于阻塞状态,说明SHARE_WRITE和SHARED_READ_ONLY不兼容。

SHARE_WRITE和SHARED_NO_READ_WRITE

image-20230721213419019

查看MDL锁信息:

image-20230721213508422

同样是PENDING状态,说明SHARE_WRITE和SHARED_NO_READ_WRITE不兼容。

EXCLUSIVE和SHARED_READ_ONLY

image-20230721213751963

查看MDL锁信息:

image-20230721213903213

说明 EXCLUSIVE和SHARED_READ_ONLY是不兼容的。

EXCLUSIVE和SHARED_NO_READ_WRITE

image-20230722101820470

查看下MDL锁情况:

image-20230722101937978

PENDING状态印证了上面的alter xxx语句阻塞,表明EXCLUSIVE和SHARED_NO_READ_WRITE不兼容。

兼容性总结

通过上面的测试,我们可以得出如下结论:

语句种类MDL锁兼容性说明
SELECT、SELECE…[FOR SHARELOCK IN SHARE MODE]SHARE_READ
INSERT、DELETE、UPDATE、SELECT…FOR UPDATESHARE_WRITE与SHARE_READ和SHARE_WRITE兼容,与EXCLUSIVE互斥
表锁(LOCK TABLES 表名 READ/WRITE)SHARE_READ_ONLY / SHARE_NO_READ_WRITESHARE_READ_ONLY 与SHARE_READ兼容,与SHARE_WRITE互斥; SHARE_NO_READ_WRITE与SHARE_READ_ONLY 和SHARE_WRITE都互斥。
DDL (ALTER…、CREATE…等)EXCLUSIVE与所有MDL锁互斥。

意向锁

概念

意向锁是另外一种表级锁,为了避免DML语句在执行的时候行锁与表锁冲突而设计的意向锁,通过意向锁使得在加表锁的时候无需检查每行数据是否加锁。

假设有如下一种表,已经在id=3的记录上有锁了。

image-20230722201953748

此时如果想给表加上表级锁,就需要循环整个表记录,对于上面的表需要扫描3次才能获取到表内数据锁情况,如果表的数据两很大,则扫描次数也会很大,这无疑降低了效率。

所以MySQL设计:当我们执行DML的时候,同时给表加上一个意向锁。

image-20230722202311573

这样在加表级锁的时候,发现有意向锁,就可以根据策略绝对是否能够加锁,无需扫描表数据。

加锁方式

意向锁无需认为手动加锁以及解锁,他是一种隐式锁,由MySQL自己控制。

意向锁表信息

意向锁的信息存储在SCHEMAPERFORMANCE_SCHEMA.data_locks下。

image-20230722203645733

上图中我开启事务,并执行select * from t1 where id = 1 for share语句,该语句会自动加上一个意向共享锁(IS)。

也会加上一个行级锁中的记录锁。

data_locks表的列信息如下:

列名说明
ENGINE存储引擎名字,比如INNODB
ENGINE_LOCK_ID存储引擎持有或者请求到的锁的ID
ENGINE_TRANSACTION_ID事务ID
THREAD_ID创建锁的会话线程ID
EVENT_ID引起锁的时间ID
OBJECT_SCHEMA锁定表的SCHEMA名
OBJECT_NAME锁定的表名
PARTITION_NAME分区名
SUBPARTITION_NAME子分区名
INDEX_NAME锁定的索引名
OBJECT_INSTANCE_BEGIN锁的内存地址
LOCK_TYPE锁的类型,依赖存储引擎,在INNODB中,TABLE代表表级锁,RECORD代表行级锁
LOCK_MODE锁模式,依赖存储引擎,在INNODB中,取值主要有 S[,GAP], X[,GAP], IS[,GAP], IX[,GAP], AUTO_INC, and UNKNOWN,其中S代表共享锁、X代表排他锁,GAP代表间隙锁等。
LOCK_STATUS锁状态,依赖存储引擎,在INNODB中,GRANTED代表获取到了锁(持有锁),WAITING等待。
LOCK_DATA锁关联数据(如果没有则是NULL),在INNODB中,如果是一个行级锁(LOCK_TYPE=RECORD)则显示一个具体的值,否则显示NULL。如果是主键索引上的锁则值为主键。当锁是在辅助索引上时,则显示辅助索引的值,并附加上主键值。

详解


SELECT…FOR SHARE

image-20230722205447382

查看锁情况:

image-20230722205546894

SELECT…FOR SHARE会加上意向共享锁(IS),有了意向共享锁后能够使用lock tables t1 read加上表读锁吗?

image-20230722205823757

并未阻塞,所以IS锁和表读锁是兼容的。

再看下IS和表写锁是否是兼容的:

image-20230722205957110

从途中可以看到lock tables t1 write被阻塞住了,所有IS锁和表写锁是互斥的。


DML所加的意向锁都是IX锁(意向排他锁)

image-20230722210809349

上图中执行了一个INSERT语句,查看下加的元数据锁类型:

image-20230722210906354

可以看到加了一个意向排他锁(IX)。

接下来在看下他与表锁的兼容情况。

image-20230722211005118

加表读锁,结果阻塞,无法成功,说明意向排他锁与表读锁是互斥的。

再看下能否加上表写锁。

image-20230722211118035

可以看到也是无法加上表写锁的得到结论:


再看下UPDATE语句。

image-20230722211607723

IX锁与表读锁互斥。

在看下IX锁与写锁兼容性:

image-20230722211740010

IX锁与表写锁互斥。

综上可以得出如下结论:

意向共享锁(IS)与表读锁是兼容的,与表写锁是排斥的,意向排他锁(IX)与表锁(无论读锁还是写锁)都是互斥的,说明意向锁和表锁严格遵守读写锁的【读读共享】【读写排他】【写写排他】的特性。

自增锁

自增锁是表级锁中的一种,他是一种隐式锁,又系统自动加锁和解锁,该锁的唯一用处就是保证自动主键的数据一致性、准确性。

自增主键的表是很常见的一种表设计方式,比如:

CREATE TABLE `t1` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

ID是自增的,数据库必须保证,多个会话添加数据的时候,ID不能出现重复的情况,这就是通过自增锁实现的。

STM32单片机远程升级 stm32远程升级 阅读详情

相关推荐

单细胞marker基因表达密度图-(还有一个包装函数)

我们借助Nebulosa,将上面的过程包装为一个函数,还是那句话,受累麻烦的事我们来解决,您轻松即可,先看看函数参数:需要注意的是,如果你只想框选某一类celltype,理想模式是这群celltype是单独聚类的,没有散落在其他类群,否则将会全部框选,效果不好,建议使用AI/PS添加。需要注意,这里我算是投机取巧了,用了一个和这个作图毫无关系的包ggnetwork,主要的目的是用他的theme_blank()主题,一次性将所有清空,当然也可以自己慢慢写,不过有现成的,为啥不用呢?这质感不就上去了嘛。

qq_42090739的博客 1368

MySQL 8 锁表问题排查总结

如果需要过滤用户/db/commond 等相关信息,也可以使用information_schema.processlist 表信息。Table_locks_waited: 指的是不能立即获取表级锁而需要等待的次数,如果数量大,说明锁等待多,有锁争用情况。温馨提示: debug会将状态信息生成到mysql的错误文件,一般锁的信息都会保存在最后几行。Table_locks_immediate: 指的是能够立即获得表级锁的次数。也可以通过mysqladmin 指令打印processlist 进程信息。

zhouzhiwengang的专栏 5050

硬件设计--DC/DC电源芯片详解

本文参考:http://www.elecfans.com/article/83/116/2018/20180207631874.html https://blog.youkuaiyun.com/wangdapao12138/article/details/79763343 第一次写博客,不喜勿喷,谢谢!!! DC/DC电源指直流转换为直流的电源,从这个定义上看,LDO(低压差线性稳压器)芯片也应该属于D...

weixin_30794499的博客 7874

MySQL8.0锁情况排查

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 作者: 杨延昭 文章来源:GreatSQL社区投稿 在数据库中,除传统的计算资源(CPU、RAM、IO)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对教据库而言显得尤其重要,也更加复杂。 本文将通过实验介绍MySQL8.0

GreatSQL2021的博客 6692

保姆级教程:用高云GW2A开发板搭建RISC-V软核处理器(含DDR3内存优化配置)

本文提供了一份详细的保姆级教程,指导开发者使用高云GW2A-LV18PG256C8 FPGA开发板搭建RISC-V软核处理器系统。教程涵盖了从开发环境搭建、PicoRV32软核集成,到关键的DDR3内存控制器配置与优化,并深入讲解了时序约束与系统调试方法,帮助初学者和爱好者实现从逻辑设计到软硬件协同的深度实践。

2a4s6d8f0g的博客 566

MATLAB实战:四桥臂逆变器3D-SVPWM调制算法仿真全流程(附代码)

本文提供了一份完整的MATLAB/Simulink实战指南,详细解析了四桥臂逆变器的3D-SVPWM调制算法仿真全流程。文章从工程实践出发,手把手指导如何搭建模型,涵盖从abc静止坐标系变换、三维空间矢量区域判定、作用时间计算到PWM信号生成与调试等核心环节,并附有代码示例和常见问题解决方案,旨在帮助工程师快速掌握这一应对不平衡负载的高效调制技术。

qsc90123456的博客 233

MySQL 8 锁表问题

核心指标说明:Table_locks_immediate: 指的是能够立即获得表级锁的次数Table_locks_waited: 指的是不能立即获取表级锁而需要等待的次数,如果数量大,说明锁等待多,有锁争用情况。

fhw925464207的博客 1280

openbmc 支持mctp over pcie(三)(支持作为endpoint)

本文介绍了在Intel BHS平台上支持MCTP over PCIe端点开发的调试方法。开发基于CodeConstruct和AspeedTech-BMC的开源项目,将内核驱动改为模块形式以便调试。内容包括DTS配置、驱动模块设置步骤,以及如何将BMC配置为端点设备。调试过程涉及内核模块加载、MCTPD启动、参数设置等关键命令,并展示了路由表、地址和邻居信息的测试结果。该方案仅为实验性工作,需注意停止其他使用/dev/aspeed-mctp0接口的应用。

wit_yuan的专栏 1554

MYSQL8的锁机制

MYSQL8的锁机制

教Linux的李老师 846

智能体开发套件(ADK)介绍

city } ---") city_normalized = city . lower() . replace(" " , "") # 模拟天气数据库 mock_weather_db = {

lpfasd123的博客 1401

华为OD机试双机位C卷-简单的解压缩算法(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【简单的解压缩算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD真题【简单的解压缩算法】。

qq_45776114的博客 474

处理MySQL8.0锁表

2、查看第一条语句的THREAD_ID,去performance_schema.threads表查找THREAD_ID对应的PROCESSLIST_ID。1、执行语句 SELECT * FROM performance_schema.data_locks。3、执行KIll PROCESSLIST_ID。

caomeiliang的专栏 1390

使用Python从图像中提取表格

python 实现图片表格提取

qq_30895747的博客 2570

MySQL8.0优化 - 锁 - 从数据操作的粒度划分:表级锁、页级锁、行锁

MySQL8.0优化 - 锁 - 从数据操作的粒度划分:表级锁、页级锁、行锁

小草的博客 1170

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL 8.0的若干知识

四、解析binlog命令。五、8.0用户方面的新特性。一、查看 .ibd文件。三、创建/删除用户等。

快速成长 603

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL 当中的锁

对 MySQL 当中的锁机制进行学习。

YGGP的博客 1164

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL新增字段/索引会不会锁表?

MySQL5.6之后,实际单纯的增加一个字段,表结构修改和索引添加通常不会锁定整个表。在某些情况下,MySQL可能需要锁定整个表。同时数据量过大的时候,会出现一些性能问题。所以实际操作的过程中,要关注表的数据多小,最终的数据大小(要关注索引数据)。同时如果你的MySQL版本较旧或出于某些特殊原因不支持在线DDL操作。需要特别注意在非高峰期执行操作,以尽量减少对业务的影响。

2401_87705025的博客 1483

Mysql 行级锁无索引时变表级锁,真的是这样吗?实测

最近学习Mysql时,发现网上往往说行级锁没有使用索引时会转为表级锁,原因是Mysql行级锁是给索引加锁。但事实真的是这样吗?自己测试了下,发现了一些问题 经测试 测试用表: employees( id INT(11) NAME VARCHAR(15))无索引 session1 begin; select * from employees where id =1 lock in share mode; session2 begin; update employees set name = ‘tom’ w

qq_34207811的博客 2089

mysql8行级锁学习

mysql8行级别锁是锁在索引上的,如果sql语句没有用到索引,则会锁表; 例如: session1执行如下sql语句: set autocommit=0; select * from tab_no_index where id = 2 for update; id列没有索引; session2执行如下sql语句: select * from tab_no_index where id = 1 for update; 则会一直处于等待中,因为没有索引,虽然查询的不是一行数据,但会触及表级锁,sessio

828

mysql 阿里云 锁等待_mysql8 参考手册--IInnoDB锁定和锁定等待信息

本节描述了性能模式data_locks和 data_lock_waits表所公开的锁定信息,这些信息取代了MySQL 8.0中的INFORMATION_SCHEMA INNODB_LOCKS和 INNODB_LOCK_WAITS表。对于用旧的条款类似的讨论INFORMATION_SCHEMA桌,看到 InnoDB的锁锁等待信息 中的MySQL 5.7参考手册。当一个事务在一个表中更新了一行,或将其...

weixin_34792641的博客 465

MySQL 所有锁机制已备好,请取用!

MySQL数据库锁设计的初衷是处理并发问题,保证数据安全。MySQL 数据库锁可以从下面 3个维度进行划分: 按照锁的使用方式,MySQL锁可以分成共享锁、排它锁两种; 根据加锁的范围,MySQL锁大致可以分成全局锁、表级锁和行锁三类; 从思想层面上看,MySQL锁可以分为悲观锁、乐观锁两种;

m0_54369189的博客 565

MySQL中的 8 种锁!

后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中..

犬小哈 105

! MySQL中的 8 种锁 !

MySQL锁机制是保障高并发场景下数据一致性的核心技术。文章系统介绍了8种MySQL锁:按粒度分为表锁、页锁和行锁;按模式分为共享锁、排他锁等。重点解析了行级锁(记录锁、间隙锁、临键锁)的实现原理和应用场景,以及表级锁和元数据锁的作用。针对死锁问题,提供了检测和解决方案。文章还给出锁优化口诀:事务要快、锁粒度要小、避免大事务,并强调索引优化对减少锁冲突的重要性。最后指出最高明的锁策略是"无锁",需要在保护数据一致性和提高并发度之间找到平衡。

废柴重生之我要当大佬 1217

【MySQL】MySQL存储引擎,索引,锁以及调优

索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。通过 Explain 分析发现表中有多个索引,MySQL 的优化器选用了错误的索引,导致查询效率偏低,然后通过在 SQL 语句中使用 use index 来指定索引解决。图中看到:Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。行级锁开销大,加锁慢,有可能会出现死锁,不过因为锁定粒度最小,发生锁冲突的概率低,并发访问效率比较高。

小冷coding的博客 1282

MySQL的慢查询性能优化与高阶操作

mysql的慢查询日志是mysql提供的一种日志记录,用来记录在mysql中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。默认情况下,Mysql数据库并不启动慢查询日志,需要手动来设置这个参数。当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

SUOYUEのBLOG 333
上一篇: Java日志框架体系
下一篇: MySQL8 行级锁
「已注销」
博客等级 码龄3年 128粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值