锁
全局锁
- 全局锁就是对整个数据库实例加锁,加锁后处于只读状态,DML写语句、DDL语句、已经更新的事务提交语句都会被阻塞,典型使用场景时全库的逻辑备份
- 加全局锁:
flush tables with read lock;
- 数据备份:
mysqldump -uroot -p1234 itcast>itcast.sql
- 解锁:
unlock tables;
- 存在以下问题:
- 主库上备份,备份期间不能执行更新,业务需要停摆
- 从库上备份,备份期间不能执行主库同步的二进制文件,导致主从延迟
- InnoDB引擎中,可以在备份时加上参数
--single-transaction
来完成不加锁的一致性数据备份
表级锁
- 每次操作锁住整张表,发生锁冲突的概率最高,并发度最低
- 分为以下三类:
- 表锁
- 表共享读锁(read lock)
- 表独占写锁(write lock)
- 元数据锁
- MDL加锁是系统自动控制,无需显式使用,在访问一张表时候会自动加上。MDL锁主要作用是维护表元数据的唯一性,在表上有活动事务时候,不可以对元数据进行写入操作
- 主要作用是避免DML和DDL的冲突,保证读写正确性,如图1
- 查看元数据锁:
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata.locks;
- 意向锁
- 为了避免DML在执行时,加的行锁和表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查,个人理解算一种本质是行锁的一种表锁
- 意向共享锁(IS):与表锁共享锁read兼容,与表锁排它锁write互斥
- 意向排它锁(IX):与表锁共享锁read以及排它锁write都互斥,意向锁之间不会互斥
- 表锁
图1
行级锁
- 每次操作锁对应行数据,发生锁冲突概率最低,并发度最高
- InnoDB的数据是基于索引组织的,行锁通过对索引上的索引项加锁实现,而不是对记录加的锁
- 主要分为以下三类:
- 行锁:锁定单个行记录的锁,防止其他事务对此进行update和delete。在RC、RR隔离级别下都支持
- 间隙锁