1. 全局锁: how: 做全库逻辑备份
为什么不使用: set global readonly = true; 这种方式呢 ?
原因1. readonly参数可能会用来做其他逻辑, 如区分主备库;
原因2. 全表锁异常,会回滚; readonly 异常会保持, 导致全库只读.
2. 表级锁: what : MDL 锁; 表锁.
表锁: what : lock tables ... read/ write
MDL锁: what : 在访问一个表时,就会被自动加上.
how: 用于保证DDL操作的正常运行.
一个MDL锁的坑:
前提: 给一个表加字段, 修改字段, 加索引, 都是要走全表扫描.
1.A B都是加MDL读锁,所以不冲突
2.C要加MDL写锁 , 与A的读锁冲突, blocked
3.D需要MDL读锁, 会被MDL写锁阻塞(即使MDL写锁没有加成功)
4.再加上客户端有重试机制, 超时后会重新起一个seesion, 这个库的线程很快会爆满;
3.如何安全的给小表加字段:
1.kill 掉长事务
2.alter table 语句设定等待时间, 确保不会阻塞后面的业务语句.
疑问1: MDL锁会等到事务提交才释放... 全部锁都是事务提交才释放把? 行锁, 间隙锁?
根据试验结果 ==>是的.
网友评论