1. 简介

锁分三种

1. 全局锁

2. 表级锁

3. 行级锁

2. 全局锁

全局锁常用于数据库备份,加了全局锁,只能查询数据

全局锁数据库命令:flush tables with read lock;

数据库备份windows命令:mysqldump [-h{ip}] -uroot -p1234 数据库名 > d:/数据库名.sql

释放全局锁数据库命令:unlocak tables;

注意事项:全局锁特别重,而且影响主库同步数据,innodb引擎可以在备份语句中在mysqldump后加 --single-transation用来完成不加锁的数据一致性备份。

3. 表级锁

表级锁分为三种,1表锁,2元数据锁,3意向锁

(1) 表锁

表锁分两种,1表共享读锁(读锁) 2表独占写锁(写锁)

加锁命令,lock tables 表名 [, 表名...] read/write;    // read读锁,write写锁

释放锁,unlock tables;// 断开客户端也会释放锁

加读锁,任何人只能读不能写,包括自己

加写锁,自己能读写,其他人不能读不能写

(2) 元数据锁 MDL(系统自动控制加锁解锁)

如果有表的事务存在,不允许更改表结构。

增删改查加MDL读锁

更改表结构加MDL写锁

(3) 意向锁 (innodb加的锁)

作用:避免加的行锁与表锁冲突,例如会话1加行锁,会话2加表锁之前要检查全表有没有行锁,影响效率。意向锁是 会话1加了行锁之后给表加意向锁,会话2加表锁前只需判断表有没有意向锁。

意向锁分类,1意向共享锁,2意向排他锁

查询语句加意向共享锁,可以与表锁读锁兼容。

增删改加意向排他锁,与表锁读写都互斥。

意向锁之间不互斥

4. 行级锁

行级锁分三种 1行锁,2间隙锁,3临键锁

(1) 行锁:锁定单行记录,防止其他事务更改删除数据

行锁分,共享锁和排他锁,共享锁之间兼容,排它锁与排它锁或共享锁都互斥。

增删改系统自动加排他锁,查询不加锁

select ... lock in share mode;查询手动加共享锁

select ... for update;查询手动加排他锁

(2) 间隙锁,临键锁

唯一索引,作为等值查询条件,若是记录不存在,会优化为间隙锁,不包含前后索引的真实数据

普通索引,作为等值查询条件,若是最后记录不存在,临键锁(相同键有多条数据)退化为间隙锁

唯一索引,范围查询,不满足条件,会在前后真实数据之间加间隙锁