全局锁和表锁
1.mysql中的锁
全局锁
表级锁
行锁
2.全局锁
Flush tables with read lock
当你需要让整个库处于只读状态的时候,更新、定义等线程将会被堵塞
使用场景:全库逻辑备份:获取一致性备份
主库上备份:备份期间业务停止
从库上备份:备份期间不能接受主库同步过来的binlog,导致主从延迟
为了拿到一致性视图:
在可重复读隔离级别下开启一个事务
3.mysqldump
自带的逻辑备份工具mysqldump,当使用参数single-transaction的时候,导数据就会自动启动一个事务,确保拿到一致性视图,在这个过程中由于mvcc的支持,这个过程中的数据是可以正常更新的
一致性读是好,但前提是引擎要支持这种隔离级别,single-transcation方法只适用于支持事务的引擎。
4.关于全库只读(不建议使用)
Set global readonly=true
(1)在一些库中,readonly的值被用来做其他判断,修改global的影响较大
(2)异常处理机制中,如果发生了客户端异常,数据库会一直保持readonly,导致库长时间不可读写,风险较高
5.表级锁
(1)表锁
(2)元数据锁
6.表锁
lock tables … read/write
unlock tables主动释放锁
表锁是最常见的处理并发的方式,对于innodb这种支持表锁的引擎,一般不使用lock tables因为其影响面太广了
如果出现lock tables要追查
(1)升级支持事务的引擎
(2)引擎升级了,但是代码还没升级,将lock和unlock变为begin和commit
7.元数据锁MDL
metadata lock
保证读写的正确性
在mysql5.5中引入了mdl,当一个表做增删改查时候,加mdl读锁;
变更表的结构变更时候,加mdl写锁
读锁之间不互相排斥,因此你可以有多个线程同时对一张表进行增删改查
读写锁之间、写锁之间是互斥的,需要等待另一个线程结束,再继续另一个线程
8.如何安全的给小表加字段
在做ddl变更的时候,刚好有长事务在执行,要考虑先暂停ddl,或者kill这个长事务
9.锁与事务的关系
事务与锁是不同的。事务具有ACID(原子性、一致性、隔离性和持久性)
锁是用于解决隔离性的一种机制。
事务的隔离级别通过锁的机制来实现。
另外锁有不同的粒度,同时事务也是有不同的隔离级别的
一般有四种:
读未提交Read uncommitted,
读已提交Read committed,
可重复读Repeatable read,
可串行化Serializable


![[丁奇四十五讲]第6讲学习笔记 [丁奇四十五讲]第6讲学习笔记](http://www.mshxw.com/aiimages/31/1017141.png)
