洗料系列-数据库专题-MySQL中的锁

锁类型一览

读操作
读类型细分阶段具体操作
普通读读未提交读未提交读未提交隔离级别下,直接读记录的最新版本
快照读MVCC

读已提交、可重复读隔离级别下的ReadView;

自动提交时串行化隔离级别的select操作

锁定读共享锁S手动加锁

select ... lock in share mode;

禁用自动提交时串行化隔离级别下的select操作;

独占锁Xselect ... for update
意向读意向读IS加S锁之前对InnoDB表的某些记录加S锁之前,需要增加表级别的IS锁
写操作
写类型细分细节
delete-X锁获取记录X锁,执行delete mark操作
update未修改键值且更新的列占用空间未变化获取目标记录X锁
未修改键值但更新的列占用空间变化

获取记录X锁,彻底删除后再插入

修改了记录的键值相当于目标记录delete后再insert
insert-隐式锁
意向写-IX锁

对InnoDB表的某些记录加X锁之前,需要增加表级别的IX锁

InnoDB表级锁

InnoDB表级锁
锁类型获取
S锁通过lock tables t read手动获得,建议使用行级锁代替
X锁通过lock tables t write手动获得,建议使用行级锁代替
IS锁对InnoDB表的某些记录加S锁之前,需要增加表级别的IS锁
IX锁对InnoDB表的某些记录加X锁之前,需要增加表级别的IX锁
AUTO_INC锁主键自增,在插入未指定主键的语句过程中获取AUTO_INC锁,执行完释放

InnoDB行级锁

InnoDB行级锁
锁类型解读
Record Lock记录锁,锁定一条记录,行S锁和行X锁
Gap Lock间隙锁,锁定一个范围,用于解决插入记录导致幻读问题
Next-Key Lock记录锁和间隙锁的合体,可以保护记录也能阻止其他事务在间隙插入导致幻读
Insert Intention Lock插入意向锁,插入时如果被间隙锁阻塞导致锁定,则生成一个插入意向锁;插入意向锁之间不相互阻塞
隐式锁隐式锁,例如insert过程中插入隐式锁,用于延迟生成锁结构

锁的状态查看

锁的状态查看途径
功能
information_schemainnodb_trx当前正在执行的事务信息
innodb_locks已获得的锁和被阻塞的锁的信息
innodb_lock_waits被阻塞事务因获取不到哪个事务持有的锁而阻塞信息
show engine innodb status:可查看整体的事务及锁的信息

死锁

事务的阻塞链形成闭环导致链上所有事务都被阻塞。

死锁检测机制会回滚较小事务(影响记录数最少)并释放其中一方的锁,保证另一个事务正常进行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐毓俊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值