目录
MySQL分为3类锁:
全局锁:锁定数据库中的所有表
表级锁:每次操作锁住整张表
行级锁:每次操作锁住对应的行数据
1 全局锁
1.1 简介
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
1.2 应用场景
全库的逻辑备份。当库中的表相互关联,进行备份的时候肯定会有一个备份时间差,此时如果一张表进行了备份,而相关联的表没有进行备份期间,如果业务系统中有新的数据入库,就有可能在未进行备份的表中加入新的数据,而这时候就会造成数据的不一致性。这时候就可以利用全局加锁来解决问题。
1.3 语法
1.3.1 加全局锁
flush tables with read lock;
1.3.2 数据备份
# itcast备份的库 itcast.sql 是存放的备份文件
mysqldump -uroot –p1234 itcast > itcast.sql
1.3.3 释放锁
unlock tables;
2 表级锁
2.1 简介
2.2 表锁
对于表锁 ,分为两类:
表共享读锁(read lock):加上表共享读锁之后,都只能读
表独占写锁(write lock):加上表独占写锁之后,只能加锁的一方进行读写操作,其他都不可以进行读或者写操作
语法
加锁:lock tables 表名 read/write;
释放锁:unlock tables;
2.3 元数据锁
2.3.1 介绍
meta data lock , 元数据锁,简写MDL。
2.4 意向锁
2.4.1 介绍
有意向锁就不能加上表级锁,从而不用去每一行的检查有没有行锁。
2.4.2 分类
意向共享锁:由语句select ... lock in share mode(也就是行共享锁)添加 。 与表锁共享锁
(read) 兼容,与表锁排他锁 (write) 互斥。意向排它锁:由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;
3 行级锁
3.1 行锁
3.1.1 介绍
InnoDB实现了两种类型的行锁:
共享锁:可由多个事务共享,与其他共享锁是兼容的。获取共享锁后,多个事务都能对该行数据进行读操作,但是不能进行修改。
排它锁:排它锁不能与其他锁共存,如果一个事务获得排它锁,其他事务都不能获得该行的锁。获取排它锁的事务可以对该行数据进行读写操作。
3.1.2 加锁操作
SQL | 行锁类型 | 说明 |
insert ... | 排它锁 | 自动加锁 |
update ... | 排它锁 | 自动加锁 |
delete ... | 排它锁 | 自动加锁 |
select ... | 不加锁 | |
select ... lock in share mode | 共享锁 | 需要手动在select..之后加上 lock in share mode |
select ... for update | 排它锁 | 需要手动造select...之后加for update |
可以使用以下sql,查看意向锁,以及行锁的加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data
from performance_schema.data_locks;