1. 全局锁
做全量备份的时候使用, 保证表与表之间的一致性
- flash tables with read lock
使用全局锁锁定所有数据库的所有表, 这时会阻塞其他所有的DML 和 DDL 操作
, 这样可以避免备份过程中的数据不一致,接下来可以执行备份, 最后用unlock tables 来解锁
给所有的表加了锁 , 可以查看数据, 修改会被阻塞。
但这属于比较重的操作, 可以使用-- single -transaction
参数来完成不加锁的一致性备份
- mysqldump --single–transaction -u root -p 数据库名 >1.sql
dump 转储
2. 表级锁
2.1 共享锁和 排他锁
共享锁(读锁) :加锁之后别的事务还可以读
排他锁(写锁): 加锁之后别的事务不能操作
表锁的力度比较粗 ,在InnoDB 引擎很少使用, 支持的并发数第低
语法 加锁: lock tables 表名 read /write , 解锁 unlock tables
2.2 元数据锁
-
加元数据锁的集中情况
- lock tables read /write 类型为 SHARED_ONLY 和 SHARED_NO_READ_WRITE
- alter table 类型为 EXCLUSIVE 与其他DML 都互斥
- select , select…lock lock in SHARED mode 为 SHARED_WRITE
- insert , update , delete select fro update 类型为 SHARED_WRITE
-
DML的元数据锁之间不互斥 -
查看元数据锁 sql 语句 -
select object_type , object_schema , object_name, lock_type, lock_druation from performance_shcema.metadata_locks
2.3 IS (意向共享锁) 与 IX(意向排它锁)
主要是为了避免写操作(DML 数据操作语言) 与 表锁冲突
- DML 主要是为行加锁, 为了不让表锁不用检查每行数据是否加锁, 加意向锁(当前锁的上一层)来减少表锁的判断, 意向锁之间不会互斥
- 有DML 语句添加, 例如 select…lock in shared mode 会加IS 锁, insert , update, select for update 会加 IX 锁
- 查看共享锁的命令
select object_schema , object_name,index_name, lock_type,lock_mode, lock_data from performance_shcema.data_locks
3. 行级锁
- 行锁 在 RC(读已提交)下, 锁住的是行, 防止其他事务对此进行update 或者 delete
- 间隙锁 在RR(可重复读)下, 锁住的是间隙 ,防止其他事务在这个间隙insert产生幻读.
- 临键锁 在RR下, 锁住的是前面间隙+行, 特定条件下可以优化为行锁
… 待完善
|