我们以一个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约束就是,在一个事务内,加锁阶段只加锁,解锁阶段只解锁
相信你们可以了解一个大概了,可以试着分析一下复杂的语句