mysql的插表以及更新操作导致的死锁问题



一.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



展开阅读全文

没有更多推荐了,返回首页