mysql 锁

全局锁:所有表

加锁: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 退化为间隙锁、

索引上的范围查询(唯一索引):会访问到不满足条件的第一个值为止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值