MySQL实战45讲

1. 锁分类

MySQL中主要分为全局锁、表级锁和行锁三类。本篇主要涉及全局锁和表级锁。
2. 全局锁

全局锁是对整个数据库实例进行加锁。

Flush table with read lock(FRTWRL)该命令用于加全局锁。使用该命令之后,整个库处于只读状态,不能执行数据的增删改查、建表、修改表和更新类事务的提交操作。

使用命令unlock tables接触锁。

全局锁的典型使用场景是做全库的数据备份。不加全局锁备份的话,备份系统拿到的不是一个逻辑时间点的库,这个视图逻辑是不一致的。

在可重复读隔离级别下,开启一个事务,那么这个事务里里面的操作看到的数据是一致的。

官方自带的逻辑备份工具是mysqldump。当mysqldump 使用参数-single-transaction的时候,导出数据的时候,会启动一个事务,**来确保拿到一致性视图。**但此功能需要引擎支持这个隔离级别。

set global readonly=true也可以让全库进入到只读状态。但还是建议使用FRTWRL进行操作,主要是因为:

readonly的值会被用来做其他逻辑,比如判断一个库是否是主库
异常机制有差别。如果执行FRTWRL命令之后由于客户端发生异常断开,那么MySQL会自动释放这个全局锁;如果是readonly方式,异常之后,数据库一直保存readonly状态。

3. 表级锁

MySQL中的表级锁有两种,分别是表锁和元数据锁(meta data lock,MDL)
3.1 表锁

表级锁的语法是lock tables ... read/write.使用unlock tables主动释放锁,也可以在客户端断开的时候自动释放。

lock tables除了会限制别的线程的读写外,也限定了本线程的接下来的操作对象。比如:在某个线程A中执行lock tables t1
read,t2 write;这个语句,则其他线程写t1、读写t2的语句都会被阻塞。同时A线程在执行unlock
tables;之前,也只能执行读t1、读写t2的操作且不能访问其他表。
3.2 元数据锁

MySQL 5.5 中引入,不需要显示使用,在访问表的时候会被自动加上。当对一个表进行增删改查的时候,加MDL读锁;当对表结构进行修改时,加MDL写锁。

读锁之间不互斥,因此可以有多个线程对一张表增删改查
读写锁之间、写锁之间互斥

4. 修改表结构导致数据库挂了的示例
41. 现象

假设有以下的一个操作

可以看到session A启动一个事务,并做了一次查询操作,但是还没有提交,这个时候会对表t加一个MDL读锁;此时session
B启动,由于session B也是查询操作,需要的是MDL读锁,可以正常执行;session C是修改操作,需要MDL写锁,但因为session
A的MDL没有释放,所以session C会被阻塞,session D查询操作,也需要个MDL读锁,但是因为session
C的写锁被堵塞,所以session D也会被阻塞,这个t表的完全不可读了。

如果这个表上的查询很频发,而且客户端有重试机制,超时之后会再起一个session 查询,这个库的链接很快就被战满而爆掉。
4.2 解决方式

跟踪事务表information_schema库的innodb_trx,在执行表结构变动之前,查看是否有长事务在执行。

在MariaDB、AliDB支持在alter table语句里面设定等待时间

        alter table table_name NOWAIT add column ...
            alter table table_name WAIT add column ...

原文地址:https://www.cnblogs.com/it-chen/p/11649328.html

时间: 2024-08-30 17:49:52

MySQL实战45讲的相关文章

极客时间-MySQL实战45讲(实践篇)2

20 | 幻读是什么,幻读有什么问题? InnoDB 的默认事务隔离级别是可重复读--rr 快照读(snapshot read) 单纯的select操作,不包括上述 select ... lock in share mode, select ... for update. Read Committed隔离级别:每次select都生成一个快照读. Read Repeatable隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读. 快照读的实现方式:undolog和

Mysql实战45讲学习详情----一条SQL更新语句是如何执行的?

相关词语: redo log:日志模块(临时记录,类似于便签),InnoDB 引擎特有日志 WAL(Write-Ahead Logging):写入方式 binlog:日志模块(归档日志),Server 层的日志 crash-safe:redo log带来的好处(MySQL 可以恢复到固定时间内任意一秒的状态) WAL执行过程(redo log日志的存储方式): write pos 是当前记录的位置,checkpoint 是当前要擦除的位置,它们之间的是“便签”上还空着的部分.如果 write p

Mysql实战45讲学习详情----为什么你改了我还看不见?

相关词汇: MyISAM:MySQL原生引擎(不支持事务) InnoDB:第三方引擎(支持事务) ACID(Atomicity.Consistency.Isolation.Durability):原子性.一致性.隔离性.持久性 MVCC:数据库的多版本并发控制 事务的概念: 事务就是要保证一组数据库操作,要么全部成功,要么全部失败. 当数据库上有多个事务同时执行时,会出现脏读(dirty read).不可重复读(non-repeatable read).幻读(phantom read)的问题,为

MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了,对于问题的原因仍不知所以. 本文开始,记录学习<MySQL实战45讲>专栏的过程. 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分. 我知道关注公众号的小伙

Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

centos mysql 实战 第六节课 字符集

centos mysql 实战 第六节课    字符集 一定要研究清楚mysql安装脚本 字符集 乱码数据迁移1. 理解字符集怎么会事2. 不同的字符集进行转换 什么是字符集gbk , utf8 gb2312 latin1 一套符号编码规则 字符串都必须有相应的字符集,除了二进制没有字符集 校验字符集的概念流式传输 多字节latin1 单字节gbk 2字节utf8 3字节校验字符集的概念, 字为单位归类的方法,就是3类xxx_bin 以二进制形式存储区分大小写 SHOW CHARACTER SE

Webpack + React全栈工程架构项目实战精讲

详情请交流  QQ  709639943 01.Webpack + React全栈工程架构项目实战精讲 02.跨平台混编框架 MUI 仿豆瓣电影 APP 03.Node.js入门到企业Web开发中的应用 04.Python3 全网最热的Python3入门+进阶 比自学更快上手实际开发 05.Java秒杀系统方案优化 高性能高并发实战 06.Java深入微服务原理改造房产销售平台 07.快速上手Linux 玩转典型应用 08.全面系统讲解CSS 工作应用+面试一步搞定 09.Java Spring

Keepalived原理与实战精讲

什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,那说到keepalived时不得不说的一个协议就是VRRP协议,可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议 注:搞运维的要有足够的耐心哦,不理解协议就很难透彻的掌握keepalived的了 一,VRRP协议VRRP协议学过网络的朋友都知道,网络在设计的

PHP100教程资料 1~45讲

链接:http://pan.baidu.com/s/1hr7r5WC 密码:xjtp? 目录 第一讲:PHP环境搭配和代码调试 1 第二讲:PHP基本语法和数据类型 3 (第三讲) 常用PHP运算类型介绍与应用 5 1.算术运算 5 2.赋值运算 5 3.比较运算 5 4.逻辑运算 5 5.递增递减运算 5 (第四讲) PHP条件语句的介绍与应用 7 1.if 条件语句 7 2.switch 条件语句 7 (第五讲) PHP循环语句的介绍与应用 8 1.break n 循环控制语句 8 2.do