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) 间隙锁,临键锁
唯一索引,作为等值查询条件,若是记录不存在,会优化为间隙锁,不包含前后索引的真实数据
普通索引,作为等值查询条件,若是最后记录不存在,临键锁(相同键有多条数据)退化为间隙锁
唯一索引,范围查询,不满足条件,会在前后真实数据之间加间隙锁