锁分类
以锁粒度分类:
- 全局锁:锁定要操作的数据库里所有的表
- 表级锁:锁要操作整张表
- 行级锁:锁要操作的一行
全局锁
加锁:flush table with read lock
解锁:unlock table
数据库逻辑备份:mysqldump -h xxxx -uroot -pxxx tablename>xxx.sql
对整个数据库加锁,数据库将处于只读状态,所有 DML写操作,DDL操作,更新操作事物提交都会被阻塞。
使用场景,数据库全库逻辑备份,使用全局s获得一致性视图,保证数据的完整性(如对一个完整业务的逻辑中,对多个表进行修改,这时若没有锁住,则对不同的表备份时,可能会有数据的修改。所以备份出来的逻辑文件,在逻辑上可能出现数据不一致)
表级锁
锁一张表,粒度大,并发低,表级锁分以下三类
表锁
表锁分类
- 表共享读锁 read lock 不会阻塞其他客户端的读,但会阻塞其自己和他客户端的写
- 表独占写锁 write lock 阻塞其他客户端的读写,自己可以读写(独占)
加锁语句
- 加锁:lock tables tablename read/write
- 释放锁:unlock tables
元数据锁(MDL)
元数据就是表结构,为了避免DML和DDL冲突导致数据不一致,所以有元数据锁
元数据锁分类
1 读锁(共享) 对一张表进行DML操作时 加DML读锁
2 写锁(排他) 对一张表进行DDL操作时 加DML写锁
读锁直接共享,读锁和写锁之间互斥
加锁语句
无需显式加锁,当访问一张表的时候系统自动加上元数据锁
事务1执行查询 但未提交 此时加了元数据读锁
事务2执行 DML操作被阻塞 ,读写锁互斥
查看元数据锁:select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
意向锁
当执行了DML语句,对一行数据进行加锁,此时如果执行DDL对表进行加锁,那么在加表锁的时候就需要先扫描全部的行查找有没有加表锁,为了减少表锁的检查 就使用意向锁。
当执行DML语句时,加上一个意向锁,当要加表锁的时候直接检查意向锁,判断意向锁和要加的表锁是否兼容,这样就不用再逐行检查行锁了,提供加表锁的效率
意向锁分类
意向共享锁(IS): select .. lock in share mode 添加 和表锁read兼容 write 互斥
意向排他锁 (IX) : insert update delete select..for update 添加 read/write都互斥 意向锁之间兼容
查看意向锁:select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
行级锁
只锁对应的一行数据,粒度小,并发高,innodb支持行级锁。行锁是对行的的索引项加锁,不是对行数据加锁。
行锁
对单行加锁,防止其他事务对他进行update delete ,在RC RR 级别下支持
行锁也分
- 共享锁(S):允许读,不允许其他事务获得这一行的排他锁 select .. lock in share mode
- 排他锁(X):不允许其他事务获得这一行的共享锁/排他锁inster update delete select ..for update
间隙锁
锁定索引记录间隙,不包括指定的索引,防止其他事务在间隙中insert 产生幻读,在RR级别下支持
临键锁
锁定索引纪录和前面的间隙,在RR级别下支持