全局锁:所有表
加锁:flush tables with read lock;
解锁:unlock tables;
使用场景:备份数据库的时候 需要全局锁
表级锁:锁一个表
表锁:
语法:
加锁:lock tables 表名 read/write
释放锁:unlock tabales / 客户端断开链接
表共享读锁:所有客户端可以读,本客户端更新会报错,其他客户端更新会堵塞
表独占写锁:本客户端可读可写,其他客户端不可读、不可写,会阻塞
元数据锁:系统自动控制,访问表的时候会自动加上,在此表上有活动事务的时候,不可以对元数据进行写入操作
当进行增删改查的时候,加mdl读锁(共享)
当对表结构进行变更操作的时候,加mdl写锁(排他)
共享读写锁和排他写锁 不能同时
查看元数据锁:
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
意向锁(为了解决加表锁时候需要去查每行的行锁太过于麻烦,所以需要加一个意向锁,标记一下,在加表锁的时候就不用去逐行查询了):
意向共享锁(is):由语句 select ... lock in share mode 添加。与表锁共享锁兼容,与表锁排他锁(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
行级锁:锁住一行数据
行锁:锁定单行记录的锁,防止其他事务对此行进行update和delete 在rc、rr隔离级别下都支持
注意:行锁是根据索引加锁的,只有筛选条件字段有索引才能加行锁
共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(x):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁
查看锁:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks
间隙锁(gap):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读 在rr隔离级别下都支持
间隙锁是共存的
索引上的等值查询(唯一索引):给不存在的记录加锁时,优化为间隙锁。
索引上的等值查询(普通索引):给右遍历时最后一个值不满足查询请求时,next-key lock 退化为间隙锁、
索引上的范围查询(唯一索引):会访问到不满足条件的第一个值为止