MySQL锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(CPU、RAM、I/O) 的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、 有效性是所有数据库必须解决的一一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

数据库中的锁可以分为:全局锁(锁定所有的表)、表级锁(每次操作锁定整张表)和行级锁。

全局锁

全局锁就是对整个数据库实例进行加锁,加锁后整个实例处于只读状态,后续的DML、DDL语句,已经更新的事务提交语句都会被阻塞。

典型的使用场景就是对数据库进行全库的备份,需要对所有表进行锁定,保证数据的一致性。(防止数据库备份是有其他事务对数据进行更新,导致备份出来的数据和数据库不一致)

语法:

sql 复制代码
-- 全表锁定
flush tables with read lock;

-- 数据库备份(mysqldump -h数据库服务器地址 -u 账号 -p密码 数据库名称>备份的文件名称)
mysqldump -h192.168.0.201 -uroot -p1root test>test.sql;

-- 解锁 
unlock tables;
sql 复制代码
mysqldump --single-transaction -uroot -proot itcast>itcast.sql

表级锁

表级锁,每次操作锁住整张表,锁的粒度较大,发生锁冲突的概率最高,并发度最低。日常开发中会经常遇到锁表导致阻塞的情况。

表级锁可以分为一下三类:表锁、元数据锁和意向锁

表锁

表锁还可以细分为:表共享锁(读锁)和表独占写锁(写锁)

读锁:加了读锁后,数据库只能读不能写

写锁:客户端加了写锁之后,该客户端能读能写,但是其他客户端既不能读也不能写

语法:

sql 复制代码
-- 加锁
lock tables 表名.. read/write

-- 释放锁
unlock tables /客户端断开连接

元数据锁 (Mate date lock MDL)

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。

作用主要就是为了规避DML(增删改查)和DDL(表结构操作)的冲突,保证读写的正确性。

MySQL5.5之后,当对一张表进行增删改查的时候,加MDL读锁(共享锁),当对一张表的表结构进行变更操作的时候,加MDL写锁(排他锁)。

共享锁之间不冲突,共享锁与排他锁冲突。

意向锁

为了避免DML(数据库更新语句)在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,通过意向锁来减少表锁的检查,通过意向锁来判断当前表锁是否可以增加。

意向锁分为两种:

意向共享锁(IS):由Select ...lock in share mode添加,与表锁共享锁兼容,与表锁排他锁互斥

意向排他锁(IX): 由Insert、update、delete、select ...for update添加,与表共享锁和表锁排他锁都互斥。意向锁之间不会互斥。

查看表锁及行级锁的加锁情况

sql 复制代码
select obj_schema,obj_name,index_name,lock_type,lock_mode,lock_data 
from performance_schema.data_locks

行级锁

行锁大致也分两种:共享锁和排他锁。

特点:InnoDB中的行锁只对索引生效。如果不加索引条件检索数据,行锁会升级为表锁

相关推荐
2301_803875616 小时前
如何通过phpMyAdmin给WordPress所有用户发送全站通知_系统表插入
jvm·数据库·python
2301_777599377 小时前
mysql如何进行数据库容量规划_评估磁盘空间增长趋势
jvm·数据库·python
NineData7 小时前
NineData 亮相香港国际创科展 InnoEX 2026,以 AI 加速布局全球市场
运维·数据库·人工智能·ninedata·新闻资讯·玖章算术
m0_377618237 小时前
Redis怎样应对大规模集群的重启风暴_分批次重启节点并等待集群状态恢复绿灯后再继续操作
jvm·数据库·python
imuliuliang8 小时前
存储过程(SQL)
android·数据库·sql
考虑考虑8 小时前
SQL语句中的order by可能造成时间重复
数据库·后端·mysql
2401_835956818 小时前
Golang怎么写基准测试benchmark_Golang基准测试教程【完整】
jvm·数据库·python
阿杰学AI9 小时前
AI核心知识129—大语言模型之 向量数据库(简洁且通俗易懂版)
数据库·人工智能·ai·语言模型·自然语言处理·向量数据库·vector database
SPC的存折9 小时前
D在 Alpine 容器中手动搭建 Discuz 全攻略(包含镜像一键部署脚本,可直接用)
linux·数据库·mysql·缓存
李兆龙的博客9 小时前
从一到无穷大 #67 大查询根因分析 - 从 PinSQL 到 RCRank
数据库·时序数据库