当前位置: 移动技术网 > IT编程>数据库>Mysql > MySQL实战45讲

MySQL实战45讲

2019年10月20日  | 移动技术网IT编程  | 我要评论
1. 锁分类 MySQL中主要分为全局锁、表级锁和行锁三类。本篇主要涉及全局锁和表级锁。 2. 全局锁 全局锁是对整个数据库实例进行加锁。 Flush table with read lock(FRTWRL)该命令用于加全局锁。使用该命令之后,整个库处于只读状态,不能执行数据的增删改查、建表、修改表 ...

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的操作且不能访问其他表。

链接:https://pan.baidu.com/s/1v5gm7n0l7tgyejcmqrmh2g 提取码:x2p5

免费分享,但是x度限制严重,如若链接失效点击链接或搜索加群 群号936682608


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语句里面设定等待时间

1
2
alter table table_name nowait add column ...
    alter table table_name wait add column ...

 

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网