Mysql的InnoDB存储引擎支持事务,默认是行锁。由于这个特性,因此数据库支持高并发,可是若是InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,并且也可能致使你的程序出错。sql
而致使行锁变为表锁的状况之一就是:数据库
SQL的更新(update)或者删除(delete)语句中未使用到索引,致使在InnoDB在对数据进行相应操做的时候必须把整个表锁起来进行检索(表锁)。而若是使用了索引的话,InnoDB只会经过索引条件检索数据,而只锁住索引对应的行(行锁)。并发
下面记录一下我遇到的问题:高并发
描述:测试
当出现这个问题的时候,从不少的地方进行了分析,而后都没法获得正确的解决方案(由于描述1模块不是我写的,因此没有去查看更新表的代码操做)spa
致使缘由:索引
在描述1中定时任务更新表A的时候,更新条件中没有使用索引,致使当进行定时任务更新表的时候造成了表锁。而后由于表A数据量比较大,检索较慢,而后致使了描述2中对表A的写操做的等锁超时。事务
最多见的索引:it
注意:对于普通索引,当“重复率”低时,甚至接近主键或者惟一索引的效果时,依然是行锁;可是若是“重复率”高时,Mysql不会把这个普通索引当作索引,即会形成一个没有索引的SQL,从而造成表锁。date