记录下网上看到的又用的资料:需要反复阅读以加深理解啊
sql语句: delete from t1 where id = 10;
RC(Read Commited) | RR(Repeatable Read ) | |
id主键+RC | 只需要对id对应的记录加上排它锁 | 同RC |
id唯一索引+RC | 需要在id对应的唯一索引上加锁,需要在聚簇索引上对应的记录加锁 | 同RC |
id非唯一索引+RC | 所有满足SQL查询条件的记录都加锁,同事这些记录在主键索引上的记录也会加锁 | 通过id索引定位到第一条满足条件的记录,加记录的排他锁,加GAP上的GAP锁, 然后加主键聚簇索引上的记录排它锁。然后读取吓一跳,重复进行,直到进行到 不再满足条件的记录, 此时不加记录的排它锁,但是需要加GAP锁。 |
id无索引+RC | 通过聚簇索引进行全表扫描,然后对每条记录都加锁。 | 锁表上所有记录,同事锁上聚簇索引内的所有GAP,以杜绝发生更新/插入/删除 操作。 |
http://hedengcheng.com/?p=771:MySQL 加锁处理分析,博主分析的很详细,阅读后受益匪浅
http://hedengcheng.com/?p=844:一个最不可思议的MySQL死锁分析:仔细阅读后,对mysql的加锁理解更加深一步