了解MySQL的全局锁和表级锁mysql
全局锁两种方式:sql
以上两种方式不一样点:
使用mysqldump 前提是 引擎支持隔离级别 ,因此single-transaction方法只适用于支持事务引擎的库;MyISAM不支持事务,因此只能使用FTWRL命令数据库
set global readonly = true
复制代码
这条语句也能够作到全库只读,可是不建议使用:安全
以上哪一种方式,一个库被全局上锁后,对立面任何一个表作字段操做,都会被锁住的多线程
即便没有全局加锁,有了表级锁,加字段也会遇到问题并发
MySQL有两种表级别的锁:一种是表锁、另外一种是元数据锁(metadata lock,MDL)工具
lock tables xxx read/write
例如 线程A执行了lock table t1 read,t2 write
效果是 包括A线程在内的全部线程对于t1表只可读,写被阻塞;t2表读写都被阻塞
lock tables操做能够用unlock tables主动释放,也能够在客户端断开的时候自动释放。post
该操做不只阻塞其余线程的操做,也阻塞了当前线程的操做学习
对于innoDB这种支持行锁的引擎,通常不使用lock tables
命令控制并发,影响过大spa
MDL(metadata lock)
MDL在访问一个表的时候会自动加上,MDL的做用是,保证读写的正确性。当表作增删改查操做时,加MDL读锁;当对表结构变动的时候,加MDL写锁。
DDL NOWAIT/WAIT n
这个语法alter table tb1_name NOWAIT add column...
alter table tb1_name WAIT N add column...
复制代码
对于使用innoDB引擎的库,建议使用–single-transaction 参数,对应用会更友好。
本文为极客时间《MySQL实战45讲》 的学习笔记,其中含有部分原文,若有侵权行为请联系我马上删除
第一节:一条SQL查询语句的执行过程