• 2020-07-08:mysql只有一个表a,什么情况下会造成死锁,解决办法是什么?


    福哥答案2020-07-08:

    表锁是不会出现死锁的,但锁等待现象是有可能的。
    行锁是行级别的,有可能出现死锁。环形等待死锁和唯一键死锁 很常见。

    避免死锁方法:
    1.减少事务操作的记录数。
    2.约定按相同顺序访问记录。
    3.对事务中要操作的记录进行排序。
    4.避免使用唯一键约束。
    5.用表锁,不用行锁。
    6.在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁,更新时再申请排他锁,因为当用户申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁。

    解除正在死锁的状态有两种方法:

    第一种杀死会话:
    1.查询是否锁表
    show OPEN TABLES where In_use > 0;
    2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)
    show processlist
    或者查询出所有需要Killd的Id;
    select concat('KILL ',id,';') from information_schema.processlist where user='root';
    3.杀死进程id(就是上面命令的id列)
    kill id

    第二种杀死事务:
    1.查看下在锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
    2.杀死进程id(就是上面命令的trx_mysql_thread_id列)
    kill 线程ID
    例子:
    查出死锁进程:SHOW PROCESSLIST
    杀掉进程 KILL 420821;
    其它关于查看死锁的命令:
    1:查看当前的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
    2:查看当前锁定的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
    3:查看当前等锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

    没标准答案,如果你有更好的答案,请直接评论。

  • 相关阅读:
    Pythonday01
    PYTHON_DAY2
    PYTHON_DAY3
    数据字典生成SQL语句
    Spring cloud Netflix >readMe
    SecureCRT的安装与激活
    MyBatis映射文件UserMapper.xml(mysql环境)
    数据库模糊查询4种用法
    MyBatis配置文件myBatisconfig.xml
    计算机基础:2进制和2进制算法。
  • 原文地址:https://www.cnblogs.com/waitmoon/p/13442850.html
Copyright © 2020-2023  润新知