先贴上异常信息:
首先确定MySQL的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,而我的表示采用INNODB的,所有更新时采用的是行级锁。
于是网上不停在找关于死锁的信息。
终于在这位大神博客中看到类似的死锁信息:http://blog.csdn.net/jerrydjy/article/details/41479315?utm_source=tuicool&utm_medium=referral;
以下内容为摘自以上大神博客:
这里说的是innodb类型的死锁!
网上找了好多东西 各种命令查看死锁信息,后面这条能用:
show engine innodb status;(根据mysql版本而异)
这命令在mysql命令行执行后如果有死锁
会出现下面这一块:
------------------------
LATEST DETECTED DEADLOCK
------------------------
然后你可以根据这块内容找到你引起死锁的语句。
然后解决它,
我这次的死锁是因为,
有这么一条语句
update 表名 set xx=xxx where xxx=xxx!
其中xxx没有索引!
innodb是行级锁,但是mysql的机制是用索引来找到该行,如果你那个where字段没有索引,那么mysql就找不到那一行,就会锁整张表了
这样后面的访问就会引发死锁!
给xxx字段加上索引
(待问题解决继续更新)
2016.12.30
经过修改后,发布到线上,此种死锁现象再也没出现过。