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
2
3
4
LOCK TABLES orders WRITE;
UPDATE orders SET status = 'completed' WHERE order_date < '2024-01-01';
-- 其他操作
UNLOCK TABLES;

缺点:线程A执行lock table t1 read,t2 write其他线程对t1的写和t2的读写被阻塞,且线程A对t1也不能写,不能访问其他表。锁住整个表影响较大。

MDL(metadata lock)

作用:防止DML和DDL冲突

对表增删改查,读锁
修改表结构,创建索引,写锁

特点:

  • 读写互斥、写写互斥
  • 语句结束不会释放,等到事务结束释放
  • 顺序性
    sessionA 读锁、sessionB 读锁不阻塞、sessionC写锁阻塞、后续session的读写都被sessionC阻塞

如何安全给小表加字段

  1. 查询是否有长事务在执行
    information_schema库的innodb_trx表查询当前执行的事务,考虑暂停DDL或者kill长事务

  2. alter table 设置超时时间,不阻塞后面语句
    ALTER TABLE tbl_name NOWAIT add column …
    ALTER TABLE tbl_name WAIT N add column …