mysql怎么避免缩表_如何避免MySQL死锁(二)

2ff34e647e2e3cdfd8dca593e17d9b0a.png

注意:MySQL不同的存储引擎内部有不同的实现,本系列文章仅讨论InnoDB引擎。

MySQL的锁,从性质来讲可以分为读锁、写锁;从粒度来讲可以分表锁、页锁、行锁;从细节上来讲可以分为记录锁、Gap锁、Next-Key锁、插入意向锁。

本节,我们从以下两个角度来解析:什么锁(重点在于锁的性质)

锁什么(重点在于锁的粒度)

采用了读写锁的设计,区别读、写操作。如下:Shared Lock(S):共享锁,读锁。(允许多个读,写需等待。)

Exclusive Lock(X):排他锁,写锁。(唯一许可。)

2. 锁什么

从锁的粒度来看,分为表锁、行锁以及介于两者之间的页锁,由于InnoDB只支持表锁和行锁,以下我们只讨论这两种。

2.1 表锁

2.1.1 Intention Lock - 意向锁

首先要明确的是意向锁是表锁,代表了是否设置了表中的行级锁,是为了支持多种粒度锁同时存在而设计。

假设需要向一个表添加一个表级X锁:没有意向锁,则需要遍历所有整个表判断是否有行锁的存在,以免发生冲突;

有意向锁,则无需遍历,通过查询表锁之间是否互相兼容即可。

意向锁表明一个事务稍后要获得针对一行记录的某种锁的对应表的表级锁,有两种:意向排它锁(简称 IX 锁)表明一个事务意图在某个表中设置某些行的 X 锁

意向共享锁(简称 IS 锁)表明一个事务意图在某个表中设置某些行的 S 锁

兼容速查表如下,其中非意向的X锁和S锁为表级锁:

e4848a4be4e9d643db20ed7025cd9c2d.png

一言以敝之,意向锁之间必须走行锁粒度的检查才能知道是否兼容,但在表级兼容检查中都为兼容;其余情况遵循读写锁的规范即可。

2.1.2 AUTO-INC Locks - 自增锁

插入自增列时需要获取的表级锁。

2.2 行锁

注意:InnoDB的行锁是针对索引加锁。(InnoDB采用聚簇索引的方式构建,当没有主键时,优先找非空唯一列,如果没有,自动创建一个6字节的自增主键列。)

此处,请重点关注Gap Locks。

f68678b18b6492f74207437555f7ed78.png

2.2.1 Record Locks - 记录锁

LOCK_REC_NOT_GAP,后文统称REC锁。

最简单的情况,只锁定单条记录。

2.2.2 Gap Locks - 间隙锁

LOCK_GAP,后文统称GAP锁。

最有意思的情况,锁定索引之间的内容。Gap锁设计的原因在于解决幻读的问题。关键:对于读取的范围加锁,且阻止插入操作。Gap锁不论S或X锁都可以互相兼容,可以同时持有

Gap锁只阻止插入,即插入意向锁!Gap locks in InnoDB are “purely inhibitive”, which means that their only purpose is to prevent other transactions from inserting to the gap.

Gap locks can co-exist. A gap lock taken by one transaction does not prevent another transaction from taking a gap lock on the same gap. There is no difference between shared and exclusive gap locks. They do not conflict with each other, and they perform the same function.

注意:在RC级别下,search和index scans是不使用Gap锁的,只在外键约束和duplicate-key检查时使用。

2.2.3 Next-Key锁

LOCK_ORDINARY,后文统称NK锁。

REC锁 + 其之前的GAP锁的组合。如GAP锁是区间(a, b),则NK锁是区间(a, b]。

2.2.4 插入意向锁

LOCK_INSERT_INTENTION,后文统称插入意向锁。

特殊的Gap锁,在插入一行记录之前设置,找到当前插入位置的Gap加锁即可。多个事务如果不是在间隙相同的位置就不用相互等待。

参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值