Mysql 死锁

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


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

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

因循环等待条件而产生的死锁只有可能是四种形式:两张表两行记录交叉申请互斥锁、同一张表则存在主键索引锁冲突、主键索引锁与非聚簇索引锁冲突、锁升级导致的锁等待队列阻塞。


死锁避免

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

转载于:https://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、付费专栏及课程。

余额充值