mysql死锁-非主键索引更新引起的Deadlock
问题:
执行如下更新时产生死锁
UPDATE contactlist SET name=’xxx’ WHERE userid=’1′ AND contact_id=’90’
报Deadlock found when trying to get lock; try restarting transaction
其中userid和c_contact_id都有索引,但不是主索引。
解决方式:
先通过userid=’1′ AND contact_id=’90’取得主键,再用主键更新。
注:
在采用INNODB的MySQL中,更新操作默认会加行级锁,行级锁是基于索引的,在分析死锁之前需要查询一下mysql的执行计划,看看是否用到了索引,用到了哪个索引,对于没有用索引的操作会采用表级锁。如果操作用到了主键索引会先在主键索引上加锁,然后在其他索引上加锁,否则加锁顺序相反。在并发度高的应用中,批量更新一定要带上记录的主键,优先获取主键上的锁,这样可以减少死锁的发生。
参考:
http://blog.csdn.net/aesop_wubo/article/details/8286215
http://www.tuicool.com/articles/JzuyIzb
http://www.tuicool.com/articles/NnM3yy
http://blog.sina.com.cn/s/blog_4acbd39c01014gsq.html
http://www.cnblogs.com/jack204/archive/2012/06/09/2542940.html