大家都知道innodb的间隙锁的纯在是为了防止幻读,因为其默认隔离级别是REPEATABLE READ ,
不加间隙锁的话没法保证这个隔离级别。
====================================================
“当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。
====================================================
其实我们shopex旗下的产品都没有用到事务编程,很多表默认都是myisam的,转innodb引擎纯粹是为了并发性能,使用行锁,像类似的情况很多,REPEATABLE READ这个隔离级别有些高,很容易产生next-key 间隙锁,从而影响性能。
倒不如把隔离级别改成READ COMMITTED ,完全满足条件又不会产生间隙锁。oracle 和postgresql 的默认级别也是这个。当然使用行锁也是有前提的,必须在利用索引的情况下才用到行锁,否则则还是表锁。这个跟他的实现有关。
=============================
InnoDB行锁是通过给索引上的索引项加锁来实现的。
=============================