MySql之锁的详解(干货请备好咖啡)

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

1.锁的概念

在数据库中,除传统的计算资源(如 CPU 、 RAM 、 I/O 等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制 ,因此产生了数据库锁 。

加锁的目的是什么?

数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影响。

如果你想一个人静一静,不被别人打扰,那么请在你的房门上加上一把锁。

2.锁的分类

类型 说明
全局锁 对整个数据库加锁
表级锁 每次操作锁住整张表,分为表锁、意向锁、元数据锁以及AUTO-INC锁
行级锁 每次操作锁住对应的行数据,分为记录锁、间隙锁以及临键锁

3.全局锁

全局锁就是对整个数据库实例加锁。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞

  • 数据更新语句MDL(数据的增删改);
  • 数据定义语句DDL(包括建表、修改表结构等);
  • 更新类事务的提交语句。

全局锁的命令:

Flush tables with read lock

执行后,整个数据库就处于只读状态了。如果需要释放锁请执行命令:

unlock tables

当然,当会话断开了,全局锁会被自动释放。

全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

加全局锁又会带来什么缺点呢?

加上全局锁,意味着整个数据库都是只读状态。

那么如果数据库里有很多数据,备份就会花费很多的时间,关键是备份期间,业务只能读数据,而不能更新数据,这样会造成业务停滞。

  • 案例一:
-- 会话窗口1,操作如下:
-- 1.打开一个数据库连接,加全局锁
flush tables with read lock;
-- 4.释放锁
unlock tables;
-- 会话窗口2,操作如下:
-- 2.查询表
select * from mylock;
-- 3.执行删除语句,失败
delete from mylock where id = 1;
-- 5.再次执行删除语句,成功
delete from mylock where id = 1;

注意:上述案例请按照序号执行。

4.表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM

InnoDBBDB等存储引擎中。MySQL 里面表级别的锁有这几种:

  • 表锁;
  • 元数据锁(MDL);
  • 意向锁;
  • AUTO-INC 锁;

4.1.表锁

表锁由 MySQL Server 实现,一般在执行DDL语句时会对整个表进行加锁,比如说 ALTER TABLE 等操作。在执行 SQL 语句时,也可以明确指定对某个表进行加锁。命令如下:

-- 表级别的共享锁,也就是读锁;
lock tables 表名 read;
-- 表级别的独占锁,也就是写锁;
lock tables 表名 write;

表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。

也就是说如果本线程对某表加了「共享表锁」,那么本线程接下来如果要对某表执行写操作的语句,是会被阻塞的,当然其他线程对某表进行写操作时也会被阻塞,直到锁被释放。

要释放表锁,可以使用下面这条命令,会释放当前会话的所有表锁:

unlock tables

另外,当会话退出后,也会释放所有表锁。

不过尽量避免在使用 InnoDB 引擎的表使用表锁,因为表锁的颗粒度太大,会影响并发性能,InnoDB 牛逼的地方在于实现了颗粒度更细的行级锁

  • 案例一:表级共享读锁
-- 会话1窗口,操作如下:
-- 1.加表级共享读锁
lock tables mylock read;
-- 2.查询数据
select * from mylock;
-- 3.插入数据
-- 1099 - Table 'mylock' was locked with a READ lock and can't be updated
insert into mylock values(1,'小强');
-- 9.释放锁
unlock tables;
-- 会话2窗口,操作如下:
-- 4.在会话2窗口再次加表级共享读锁,成功
lock tables mylock read;
-- 5.查询数据
select * from mylock;
-- 6.新增数据
-- 1099 - Table 'mylock' was locked with a READ lock and can't be updated
insert into mylock values(1,'小明');
-- 7.释放锁
unlock tables;
-- 8.再次新增数据,由于会话1窗口有表级读锁,所以处于等待状态
insert into mylock values(1,'小明');

注意:上述案例请按照序号执行。

  • 案例二:表级独占写锁
-- 会话1窗口,操作如下:
-- 1.加表级排他锁
lock tables mylock write;
-- 2.当前会话被锁定的表执行查询操作被阻塞
-- select * from mylock;
-- 3.执行修改操作,OK
update mylock set name = '小红' 
MySQL】如何理解MySQL(图文并茂,一网打尽) 这里博主整理我们常见的MySQL的概念,还介绍了面试中 常问的关于乐观、悲观的 一些特点。后续还有更多内容与大家分享~ 阅读详情

相关推荐

MySQL

遇见已是上上签 岂敢追求到永远MyISAM使用表级,InnoDB采用更细粒度的行级别,提高了数据表的性能。InnoDB行级别的通过索引来实现,如果查询条件中有主键则定主键,如果有索引则先定对应索引然后再定对应的主键(可能造成死),如果没有索引则会定整个表。悲观:操作数据库时采用悲观的态度,认为别人会在此时并发访问数据库

Mr.xing的博客 3064

MySQL(深度解析)

本文介绍了InnoDB存储引擎中的机制,主要包括以下内容: 的类型: 共享(S Lock)和排他(X Lock)的区别及兼容性。 意向(IS Lock和IX Lock)的作用及表级意向与行级的兼容性。 的算法: Record Lock:定单个行记录。 Gap Lock:定索引记录之间的范围。 Next-Key Lock:结合Gap Lock和Record Lock,解决RR隔离级别下的不可重复读和幻读问题。 读取: 一致性非定读(MVCC机制)在READ COMMITTED和REPE

427

MySQL图形界面客户端

图形界面客户端 使用图形界面客户端操作数据库更直观、方便。下面三个客户端都能操作MySQL,各有各自的优点。 1、Navicat Premium 安装包下载链接:https://pan.baidu.com/s/1e0KKZn8xEnQXCLPLfzYdow 密码:jk6f 新建连接: 建立MySQL连接: 点击“确定”。 然后可以看到自己建的数据库、表,也可以利用右键建立...

LDC,公众号【轻松学编程】 3万+

一文读懂 MySQL

是计算机用以协调多个进程间并发访问同一共享资源的一种机制。MySQL中为了保证数据访问的一致性与有效性等功能,实现了机制,MySQL中的是在服务器层或者存储引擎层实现的。

说故事的五公子 8805

【史上最全】MySQL各种详解:一文搞懂MySQL的各种

隐式上(默认,自动加自动释放)显式上(手动)解(手动)1. 提交事务(commit)2. 回滚事务(rollback)3. kill 阻塞进程为什么上了写,别的事务还可以读操作?因为InnoD‍B有,可以使用快照读,而不会被阻塞。单个行记录上的(点查)Record Lock总是会去住索引记录,如果InnoDB存储引擎表建立的时候没有设置任何一个索引,这时InnoDB存储引擎会使用隐式的主键来进行定。

木牛的博客 7257

手把手教你用 Flink + CDC 实现 MySQL 数据实时导入 StarRocks(干货

本文介绍了如何利用Apache Flink结合CDC技术实现MySQL数据实时导入StarRocks的完整方案。文章首先分析了Flink+CDC+StarRocks组合的技术优势,然后详细讲解了环境准备与工具安装步骤,包括Flink 1.20.1、Flink-CDC 3.3.0及相关驱动程序的配置。作者分享了在实际部署过程中遇到的版本兼容性问题及解决方案,并提供了开发环境与生产环境的硬件配置建议。通过清晰的IP地址规划表,展示了各组件在分布式环境中的部署架构,为读者提供了可落地的技术实践指南。

小 tom的博客 2554

MySQLMySQL的那点事

MySQL如何造成死

杰叔叔不是个好叔叔的博客 825

mysql编程界面_MySQL图形界面客户端

图形界面客户端使用图形界面客户端操作数据库更直观、方便。下面三个客户端都能操作MySQL,各有各自的优点。1、Navicat Premium下载安装包下载关注公众号【轻松学编程】,然后回复【navicat】获取 新建连接: 建立MySQL连接: 点击“确定”。然后可以看到自己建的数据库、表,也可以利用右键建立新的数据库和表。 打开SQL语句编辑器: 然后就可以编写SQL语句了(ctrl +鼠标滚轮...

weixin_31735943的博客 6974

MySQL性能优化全攻略:从青铜到王者的进阶之路

我的SQL跑了3分钟还没出结果,客户已经打来第8个投诉电话了…”“明明加了索引,为什么查询还是慢得像蜗牛?“数据库CPU又100%了,运维同学正在提刀赶来的路上…”如果你也曾被这些问题困扰,那么恭喜你,来对地方了!🎯欢迎来到专栏的导航中心!这里没有枯燥的理论堆砌,只有实战满满的优化秘籍。我们将一起揭开MySQL的神秘面纱,让慢查询统统消失,让数据库飞起来!

✨ 欢迎来唠嗑、切磋、一起成长!👋 1682

2021Java常见面试题分享,极致干货

开篇闲扯 打工人,打工魂,我们生而人上人。当“资本主义”逐渐禁锢我们人(大)上(韭)人(菜)肉体的时候,那一刻我才明白那个日不落帝国·资本主义收割机·瑞民族之光幸·瑞幸咖啡是多么的了不起,尽管我不懂咖啡,但还是要说一声谢谢!说到咖啡,喝完就想上厕所,对写bug的我来说太不友好了,毕竟我不(很)喜欢带薪上厕所。 回归本次的不正经Java文章。上篇文章末尾处已经提到了,主要会把我对Synchronized的理解进行一次全方位的梳理,如果能帮助到大家吊打面试官,万分荣幸。 1.美团面试官问的Spring Boo

m0_56530263的博客 250

干货分享!GC+堆排+Tomcat+算法题

开篇闲扯 打工人,打工魂,我们生而人上人。当“资本主义”逐渐禁锢我们人(大)上(韭)人(菜)肉体的时候,那一刻我才明白那个日不落帝国·资本主义收割机·瑞民族之光幸·瑞幸咖啡是多么的了不起,尽管我不懂咖啡,但还是要说一声谢谢!说到咖啡,喝完就想上厕所,对写bug的我来说太不友好了,毕竟我不(很)喜欢带薪上厕所。 回归本次的不正经Java文章。上篇文章末尾处已经提到了,主要会把我对Synchronized的理解进行一次全方位的梳理,如果能帮助到大家吊打面试官,万分荣幸。 01 MySQL相关 1.1 面试问题

m0_56301848的博客 121

程序员打字练习_1024 程序员节,以下内容可能引起强烈舒适……

( 对你的爱藏在文末 ❤️ )话说有这么一群神奇的生物:他们喝的是咖啡,挤的是代码……他们总会被黑无趣,却致力于让世界变得有趣……他们靠技术吃饭,但大多数人只关注他们的服装和发量……他们的名字是:程!序!员!今天又是一年 1024 程序员节,于是连夜整理了一些技术干货和福利送给大家。愿可爱的程序员们都能远离焦虑、加班、脱发的困扰,人生也越来越好~ 系列1:让人生更好一点你可能不欠缺技术,也不欠缺...

weixin_39609770的博客 186

windows10安装mysql5.7版本

windows安装mysql5.7 1、下载 下载mysql-5.7.28-winx64.zip 方式1:官网,选择mysql-5.7.28-winx64 方式2:关注公众号“轻松学编程”,回复mysql57获取 2、添加my.ini 解压到自己指定的路径,添加my.ini与sqlData文件夹 my.ini内容 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql

LDC,公众号【轻松学编程】 466

MySQL篇 』:MySQL 机制介绍

MySQL机制详解

m0_56361048的博客 8843

MySQL篇(机制 基本介绍、全局\表级\行、悲观\乐观

是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,数据库而言显得尤其重要,也更加复杂。全局就是对整个数据库实例加,加后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

思维码途 4481

MySQL详解

在高并发场景下数据库性能往往是尤为重要的,通常会采用一些缓存中间件来解决数据库并发问题。这篇文章将介绍数据库层面一些与并发有关的知识。

小小太空人的博客 3026

MYSQL基础知识(全局,表(共享、排他)、行(共享、排他),间隙、临键,元数据,意向

是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,数据库而言显得尤其重要,也更加复杂。数据库是为了解决事务的隔离性问题,为了让事务之间相互不影响,每个事务进行操作的时候都会对数据加上一把特有的,防止其他事务同时操作数据。

小昵称的博客 3249

MySQL-进阶篇-(全局、表级、行级

MySQL-进阶篇-(全局、表级、行级

聂可以的博客 8086
上一篇: MySql之事务详解
下一篇: Ai工具网站分享
小杨摆摆
博客等级 码龄4年 49粉丝 4原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值