一.mysql的死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB;
二..开发过程中碰到的场景:
1.为了提高存储过程查询速度的效率,在一张表(A)的status中新增了一个普通索引;
2.整个过程大致两个过程:
a.内部处理把表A中status为'3'的数据先锁住(主要是防止并发访问),外部一直进行表的插入操作,插入的status也为‘3’',在该过程中产生了死锁现象;
3.通过mysq查询死锁语句:show engine innodb status,查询死锁的原因,
三.问题原因分析:InnoDB行锁是通过给索引上的索引项加锁来实现的,
四.通过两个窗口模拟测试;
1.
SET autocommit=0;
SELECT * FROM t1 WHERE STATUS='1' FOR UPDATE; // 在MySQL中,行级锁并不是直接锁记录,而是锁索引
2.insert into t1 (id ,status) valus ('100032','1'); //在1没有提交前,无法进行提交
【注:insert into t1 (id ,status) valus ('100032','2'); //是可以提交成功的】
四.解决
1.因为状态的业务已经确认,插入的状态跟状态的状态需要一致,后来还是把staus的索引去掉,牺牲一部分性能来解决死锁的问题。
查考资料:
http://kanbol.iteye.com/blog/1881223
http://blog.csdn.net/lapiggy/article/details/6715641