InnoDB的加锁情况

我们以一个sql为例讨论加锁过程

sql:“delete from t1 where id=10”;对他进行分析

在不明白数据库中索引情况和事务隔离级别的时候,是无法作出判断的

id是主键,隔离级别 RC(read commited)

在这里插入图片描述
这种情况下,id就是聚簇索引,只需要通过索引找到id=10的记录,给他加X锁(排他锁)

id是唯一索引,+RC

在这里插入图片描述
id不是主键索引了,先按照辅助索引找到id=10的记录加X锁,再将对应的聚簇索引也加X锁,防止并发sql进行xie操作

id是非唯一索引+RC

在这里插入图片描述
id是普通索引,找到id=10的所有记录都加X锁。对应的聚簇索引也加X锁

id无索引+RC

在这里插入图片描述
没有索引时,就是全表扫表,需要对表都加X锁

优化:对不满足条件的语句,判断后放锁(违背了2pl的约束)

id主键+RR

对id=10加X锁

id唯一索引+RR

对id=10加X锁,对应的聚簇索引加Xsuo

id非唯一索引+RR

在这里插入图片描述
对id=10加X锁,在GAP上加GAP锁,然后对主键聚簇索引上加X锁

id没有索引 +RR

全锁,加GAP

在这里插入图片描述
2pl约束就是,在一个事务内,加锁阶段只加锁,解锁阶段只解锁

相信你们可以了解一个大概了,可以试着分析一下复杂的语句

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88424862