MYSQL死锁

声明:以下讨论只是针对InnoDB存储引擎。

何为死锁?
 
  死锁是对资源的分配和使用不当而造成的。是两个进程争夺某一资源而出现相互等待的现象。
  具体的来讲,出现死锁需要满足四个必要条件:
(1)互斥条件:每一个资源都只能被一个进程使用
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
   很显然,出现死锁需要两个或者两个以上的进程,换句话说,死锁发生在并发的程序中。
   在Mysql中,由于目前只有InnoDB引擎使用事务(InnoDB支持锁),便有了InnoDB和死锁的旷世基情。

死锁的检测

   1、通过使用Show innodb status检查引擎状态 ,可以看到哪些语句产生deadlock
   2、MySQL提供了一个information_schema,通过查看innodb_locksinnodb_trxinnodb_lock_waits这几个表检测死锁。

    因循环等待条件而产生的死锁只有可能是四种形式:

两张表两行记录交叉申请互斥锁、同一张表则存在主键索引锁冲突、

主键索引锁与非聚簇索引锁冲突、锁升级导致的锁等待队列阻塞。


死锁避免


1、如果使用insert…select语句备份表格且数据量较大,在单独的时间点操作,避免与其他sql语句争夺资源,或使用      select into outfile加上load data infile代替 insert…select,这样不仅快,而且不会要求锁定
2、 一个锁定记录集的事务,其操作结果集应尽量简短,以免一次占用太多资源,与其他事务处理的记录冲突。
3、更新或者删除表格数据,sql语句的where条件都是主键或都是索引,避免两种情况交叉,造成死锁。对于where      子句较复杂的情况,将其单独通过sql得到后,再在更新语句中使用。
4.、sql语句的嵌套表格不要太多,能拆分就拆分,避免占有资源同时等待资源,导致与其他事务冲突。
5.、对定点运行脚本的情况,避免在同一时间点运行多个对同一表进行读写的脚本,特别注意加锁且操作数据量比较       大的语句。
6、应用程序中增加对死锁的判断,如果事务意外结束,重新运行该事务,减少对功能的影响。

本文转载自:http://www.cnblogs.com/benshan/archive/2013/05/09/3068886.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值