6全局锁和表锁
全局锁
FTWRL
FTWRL命令:flush tables with read lock ,库进入只读状态
场景:全库逻辑备份
mysqldump
mysqldump -single-transaction 由MVCC支持一致性,但MyISAM不支持可重复度隔离级别
前提条件:库中所有表使用事务引擎库,否则使用FTWRL
set global readonly
set global readonly=true
不推荐使用
- 此参数可能用于做逻辑处理
- 客户端异常后数据库会一直保持readonly状态,风险高;FTWRL异常会释放全局锁
表级锁
表锁、元数据锁
表锁
语法:lock tables … read/write
示例:
1 | LOCK TABLES orders WRITE; |
缺点:线程A执行lock table t1 read,t2 write其他线程对t1的写和t2的读写被阻塞,且线程A对t1也不能写,不能访问其他表。锁住整个表影响较大。
MDL(metadata lock)
作用:防止DML和DDL冲突
对表增删改查,读锁
修改表结构,创建索引,写锁
特点:
- 读写互斥、写写互斥
- 语句结束不会释放,等到事务结束释放
- 顺序性
sessionA 读锁、sessionB 读锁不阻塞、sessionC写锁阻塞、后续session的读写都被sessionC阻塞
如何安全给小表加字段
查询是否有长事务在执行
information_schema库的innodb_trx表查询当前执行的事务,考虑暂停DDL或者kill长事务alter table 设置超时时间,不阻塞后面语句
ALTER TABLE tbl_name NOWAIT add column …
ALTER TABLE tbl_name WAIT N add column …