2021-11-16

Mysql数据库锁了解

#锁类型思维导图

在这里插入图片描述

##乐观锁与悲观锁

当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(实现方式如:行锁、表锁、读锁、写锁等)

乐观锁相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测。(实现方式如:版本号机制,时间戳机制)

读操作多的用乐观锁,更新操作多的用悲观锁

共享锁与排他锁

InnoDB 实现了标准的行级锁,包括两种:共享锁(简称 s 锁)、排它锁(简称 x 锁)。
共享锁(S锁):允许持锁事务读取一行。
排他锁(X锁):允许持锁事务更新或者删除一行。
如果事务 T1 持有行 r 的 s 锁,那么另一个事务 T2 请求 r 的锁时,会做如下处理:
T2 请求 s 锁立即被允许,结果 T1 T2 都持有 r 行的 s 锁
T2 请求 x 锁不能被立即允许
如果 T1 持有 r 的 x 锁,那么 T2 请求 r 的 x、s 锁都不能被立即允许,T2 必须等待T1释放 x 锁才可以,因为X锁与任何的锁都不兼容。

意向锁

意向共享锁( IS 锁):事务想要获得一张表中某几行的共享锁
意向排他锁( IX 锁): 事务想要获得一张表中某几行的排他锁
比如:事务1在表1上加了S锁后,事务2想要更改某行记录,需要添加IX锁,由于不兼容,所以需要等待S锁释放;如果事务1在表1上加了IS锁,事务2添加的IX锁与IS锁兼容,就可以操作,这就实现了更细粒度的加锁。

InnoDB存储引擎中锁的兼容性如下表:

在这里插入图片描述

记录锁(Record Locks)

记录锁是最简单的行锁,仅仅锁住一行。如:SELECT * FROM appconfig.tb_user_menu WHERE user_id= ‘1189848551096614913’ FOR UPDATE
记录锁永远都是加在索引上的,即使一个表没有索引,InnoDB也会隐式的创建一个索引,并使用这个索引实施记录锁。
会阻塞其他事务对其插入、更新、删除
记录锁的事务数据(关键词:lock_mode X locks before rec),
RECORD LOCKS space id 1161 page no 153 n bits 112 index PRIMARY of table appconfig.tb_user_menu trx id 63224149 lock_mode X locks before rec insert intention waiting
Record lock, heap no 22 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
0: len 19; hex 31313839383631393334323136373439303537; asc 1189861934216749057;;
1: len 6; hex 000003c1f5c4; asc ;;
2: len 7; hex 280000037722ad; asc ( w" ;;
3: len 30; hex 5b7b226d656e755f636f6465223a226c6567227d2c7b226d656e755f636f; asc [{“menu_code”:“leg”},{"menu_co; (total 586 bytes);
4: len 4; hex 609cb9c1; asc ;; 5: len 4; hex 609cb9c1; asc ;;

##间隙锁(Gap Locks)

间隙锁是一种加在两个索引之间的锁,或者加在第一个索引之前,或最后一个索引之后的间隙。
使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据。
间隙锁只阻止其他事务插入到间隙中,他们不阻止其他事务在同一个间隙上获得间隙锁,所以 gap x lock 和 gap s lock 有相同的作用。
Next-Key Locks
Next-key间隙锁是记录锁和锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁。

插入意向锁(Insert Intention)

插入意向锁是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号,亦即多个事务在相同的索引间隙插入时如果不是插入间隙中相同的位置就不需要互相等待。
假设有索引值4、7,几个不同的事务准备插入5、6,每个锁都在获得插入行的独占锁之前用插入意向锁各自锁住了4、7之间的间隙,但是不阻塞对方因为插入行不冲突。
insert加锁策略:
insert语句会对插入的这条记录加排他记录锁,在加记录锁之前还会加一种 GAP 锁,叫做插入意向(insert intention)锁,如果出现唯一键冲突,还会加一个共享记录(S)锁。
事务1持有:IX锁(表锁),gap x锁
事务2持有:IX锁(表锁),gap x锁,insert intention lock(在等待事务1的gap锁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值