向innodb数据表中写数据死锁。搜集资料如下
一、形成死锁的四个必要条件
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。即A在等待B占有的资源、B在等待C占有资源。。。Z在等待A占有的资源。
破坏上面任一条件都可避免死锁。
发生死锁后的解决办法:
1、撤消陷于死锁的全部进程;
2、逐个撤消陷于死锁的进程,直到死锁不存在;
3、从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
4、从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态
参考 http://zhidao.baidu.com/question/65925327
二、innodb行级锁定原理
搜索或扫描一个表索引之时,InnoDB以这样一种方式实行行级锁定,它对任何遇到的索引记录设置共享的或独占的锁定。因此,行级锁定实际是索引记录锁定。
三、所遇到死锁
5台服务器同时以SQL语句:
REPLACE INTO tableName VALUES('tid1','currentTimestamp'...),('tid1','currentTimestamp'...),...('tid1','currentTimestamp'...);#5000条记录,其中tid1 ,currentTimestamp 联合索引做主索引
向mysql innodb表写入数据,报如下错误:
Deadlock found when trying to get lock; try restarting transaction
四、解决方式
将5000条记录按主索引tid,currentTime排序后拼成SQL语句,这样可以破坏四条件中的第四个,以避免死锁。