日期:2014-05-16  浏览次数:20789 次

mysql死锁
最近的项目,每一个事务的的动作太多,然后测试发现有功能导致mysql死锁了
不过很奇怪的是,死锁的语句是一条单纯的非事务update语句,这个我就有点想不通了,如果说是另一个事务锁住了当前行,那么这条update就一句话肯定是无法阻挡事务的继续执行,那么事务执行完毕之后,次update便可以顺利执行了,现在的现象是,用show processlist查看整个数据库就只有这条update处理update状态,没有任何其他语句阻塞,直到达到超时时间50秒,才释放.
这还请高手指点原因.
另外,如果事务锁表较多,是否应该尽量使用同一顺序?如果表有差异,却有局部相同的表,怎么处理比较好呢?

------解决方案--------------------
锁是锁的索引块 并不是锁数据行

如果一个update锁定第1,2,3索引块 第二个update也需要锁定第1,2,3索引块

则第二个如果锁的顺序是3,2,1 则可能和第一个update产生死锁
------解决方案--------------------
show process 看一下是和哪个进程产生冲突。
------解决方案--------------------
show innodb status可以看上一次死锁的原因
------解决方案--------------------
mysql5.5之后 show engine innodb status\G
------解决方案--------------------
你的语句是什么? 表的create table 语句是什么? show index from xxx 也一同贴出以供分析。