介绍:
分类:
全局锁
介绍:
演示:全局锁进行数据备份
在一个命令行窗口,将mysql_test数据库锁定,在另一个命令行窗口不登入进mysql,执行备份操作。
备份成功。
解锁。
特点:
表级锁
介绍:
表锁
读锁演示:
在一个客户端给表score加读锁,自己这个客户端(报错)和其他和客户端(阻塞)都不能执行写操作。解除锁后,在阻塞的客户端立马更新执行命令。
写锁演示:
在一个客户端给score表加了写锁,自己能读也能写,其他客户端读写都被阻塞。释放锁后立即执行。
元数据锁(meta data lock,MDL)
查看元数据锁:
select
object_type,
object_schema,
object_name,
lock_type,
lock_duration
from performance_schema.metadata_locks;
意向锁
分类
可以通过以下SQL,查看意向锁及行锁的加锁情况:
select
object_schema,
object_name,
index_name,
lock_type,
lock_mode,
lock_data
from performance_schema.data_locks;
意向锁演示:
先在一个客户端开启事务,在执行以下语句
再在另一个客户端执行意向锁查看的语句
可以发现,为表stuid为4的行加了行锁,以及整个表的意向共享锁。
我们再为stu表加表锁
可以发现,读锁可以添加,而写锁添加不了,这是因为,意向共享锁与读锁兼容,与写锁互斥 。
提交事务后再开启,我们对stu表执行一个更新操作
再在另一个客户端查看意向锁的情况
发现对stu表添加了意向排他锁及对第三行添加了排他行锁。
我们在这个客户端进行添加读写锁
发现都添加不了,这就是意向排他锁!
行级锁
介绍:
行锁
行锁演示:
在一个客户端开启事务,更新表stu数据,name字段加了unique索引
在另一个客户端也同样更新表stu中数据
更新成功。
提交事务再开启,再根据score更新stu表中数据,score没有添加索引
在另一个客户端更新stu表,发现阻塞
这是因为score字段没有索引,此时加的就是表锁
间隙锁/临建锁
注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会组织另一个事务在同一间隙上采用的间隙锁。