MYSQL InnoDB的索引和锁

备注:X锁是排它锁(写锁),S锁是共享锁(读锁)

mysql中每个表都有一个聚簇索引(clustered index ),
除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。

以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果您的表上定义有主键,该主键索引是聚集索引。
如果你不定义为您的表的主键时,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引。
如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。

delete from t1 where id = 10;

  1. MYSQL的InnoDB中加锁,锁的是数据表中记录的索引

2.id不是主键,而是一个Unique的二级索引键值,name是主键。那么在RC隔离级别下,delete from t1 where id = 10; a.delete会走id的唯一索引,首先会锁定 id=10的记录上加X锁, b.并且会找到id=10的记录上所对应的name(主键)加上x锁。

试想一下,如果并发的一个SQL,是通过主键索引来更新:update t1 set id = 100 where name = ‘d’; 
此时,如果delete语句没有将主键索引上的记录加锁,那么并发的update就会感知不到delete语句的存在,
违背了同一记录上的更新/删除需要串行执行的约束。

3.id不是主键,而是一个普通的索引,name是主键 a.delete会走id的唯一索引,首先会锁定 id=10的所有记录上加X锁, b.并且会找到id=10的所有记录上所对应的name(主键)加上x锁。

转载于:https://my.oschina.net/st9/blog/680704

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值