锁是什么
锁的分类
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML、DDL语句,已经更新操作的事务提交语句都将被阻塞
应用场景:
使用全局锁进行数据库逻辑备份的过程:
flush tables with read lock;
mysqldump -uroot -p123456 user>user.sql
unlock tables;
案例演示(模拟三个客户端):
flush tables with read lock;
select * from student;
执行update语句--->失败
update student set name = 'A' where id = 2;
mysqldump -h192.168.200.202 -uroot -p1234 db01 > D:/db01.sql
注意:mysqldump是MySQL提供的一个工具,不是sql语句,需要在windows命令行中执行
在D盘中可以看到数据已经备份完成
数据备份成功后,在客户端A中释放锁
unlock tables;
此时在客户端B中update就可以正常执行。
全局锁的好处:
全局锁的弊端:
其他实现一致性数据备份的方式:
在InnoDB引擎中可以在备份时加上参数 --single-transaction
参数来完成不加锁的一致性数据备份。其底层是通过快照读实现。
mysqldump --single-transaction -uroot –p123456 database > database.sql
表级锁,顾名思义,在每次操作时锁住整张表。应用在MyISAM、InnoDB、BDB等存储引擎中
表锁分类:
加锁的语法:
lock tables tb1 , tb2... read / write
释放锁的语法:
unlock tables 或者关闭客户端连接
写锁案例演示:
lock tables score read ;
select * from score;
update score set math = 100 where id = 2;
在客户端B中执行查询语句--->查询成功
select * from score;
在客户端B中执行更新语句--->更新处于阻塞状态
update score set math = 100 where id = 2;
读锁案例演示:
lock tables score write ;
select * from score;
update score set chinese = 100 where id = 2;
select * from score;
update score set chinese = 100 where id = 2;
元数据锁的案例演示:
begin
select * from score;
begin
select * from score;
update score set math = 88 where id = 1;
commit;
begin
select * from score;
alter table score add column java int;
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;
意向锁的分类:
select ... lock in share mode
添加 。insert、update、delete、select...for update
添加 。我们可以通过以下语句查看意向锁是否添加成功:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
案例演示:
lock in share mode
加上意向共享锁IS:begin;
select * from score where id = 1 lock in share mode;
lock tables score read;
lock tables score write;
update score set math = 66 where id = 1;
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
lock tables score read;
锁之间的兼容和排斥情况:
SQL增删改查语句对应加的行锁:
默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用临键锁进行搜索和索引扫描,以防止幻读。
我们可以通过以下语句查看行锁是否添加成功:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
案例演示:
如果根据索引进行等值查询,且该索引是普通索引(字段上的记录值有可能重复),那么在叶子节点中向右遍历的最后一个值不满足查询需求时,临键锁退化为间隙锁。
如果根据索引进行范围查询,且该索引是唯一索引(如主键索引),那么会加上临键锁,会访问到不满足条件的第一个值为止。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。