zoukankan      html  css  js  c++  java
  • Mysql 死锁

    http://www.cnblogs.com/benshan/archive/2013/05/09/3068886.html

     声明:以下讨论只是针对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.应用程序中增加对死锁的判断,如果事务意外结束,重新运行该事务,减少对功能的影响。
     
     
  • 相关阅读:
    MLlib--FPGrowth算法
    MLlib--SVD算法
    算法--访问单个节点的删除
    算法--环形链表插值
    算法--数组变树
    算法--滑动窗口
    RMAN备份失败之:mount: block device /dev/emcpowerc1 is write-protected, mounting read-only
    OPatch failed with error code 73
    Sybase ASE报错:server Error: 8242, Severity: 16, State: 1
    ORA-00257: archiver error. Connect internal only, until freed
  • 原文地址:https://www.cnblogs.com/xiaobaxiing/p/6539954.html
Copyright © 2011-2022 走看看