InnoDB锁问题  

http://blog.163.com/wjf_j2ee2009/blog/static/13260200020106172823909/

 

锁表的问题


innodb锁表问题

http://book.51cto.com/art/200806/77628.htm

 

死锁的形成

http://blog.sina.com.cn/s/blog_7a3510120100z977.html

 


mysql innodb表写数据中形成的死锁



向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语句,这样可以破坏四条件中的第四个,以避免死锁。