当前位置: 首页 > news >正文

【数据库死锁】线上问题之数据库死锁

原本平静的一天,惊现生产项目瘫痪问题,马上打开日志,发现后台日志提示了多个“com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction”

大概去了解一下这个异常:

解释:MYSQL事务回滚异常,超过锁等待超时;尝试重新启动事务
原因:执行update的SQL语句时,由于表被锁座,无法更新,导致时间超时;
此时在数据库对当前表进行update语句更新时,会提示:时间超时
当执行一个方法请求到数据库,抛出当前异常时,即使定位到执行的是哪一条SQL语句。确定是哪一张表;
MYSQL中手动执行该update语句时,提示:失败,等待锁超时;

解决方案:
1.查看数据库被锁表的进程,若表被锁住,可以查看到当前锁表的进程信息,若表被一直锁住不释放,则信息会一直存在;
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.找到当前锁表的进程ID,即:trx_mysql_thread_id,将其终止
kill 进程ID;
此时当前表会被释放,即可正常进行update操作。

以上只是解决锁表的临时解决方案,并不推荐,应该从造成锁表的原因去调整,避免后续执行方法时也会锁表;

实际问题

但是当时的实际情况是,确实有很多被锁的事务,对应了多张表,但是查看代码,并没有添加事务,重启服务也没有解决这个问题,想到肯能是数据库服务的问题,最后一看,数据库的服务器内存满了…

扩展

  1. 查看未提交的事务
    select * from information_schema.INNODB_TRX;

  2. 查看正在锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

  3. 查看正在等待锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

  4. 查看进程
    show processlist

  5. 查看是否锁表
    show open tables where in_use > 0

  6. 杀死被锁的进程
    trx_mysql_thread_id为被锁的事务id,可以使用kill 线程id 杀死对应的线程,达到释放锁效果

参考

生产异常 Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceed

mysql查询死锁sql

http://www.lryc.cn/news/35960.html

相关文章:

  • 好友管理系统--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)
  • Redis 集群 Redis Cluster搭建
  • 博客系统(前后端分离版)
  • 第十二章 opengl之模型加载(Assimp)
  • Stable Matching-稳定匹配问题【G-S算法,c++】
  • TypeScript(四)接口
  • Python-基础知识
  • 【java基础】集合基础说明
  • MySQL的下载及安装详细教程
  • SSL/TLS协议工作原理
  • 大数据项目实战之数据仓库:用户行为采集平台——第4章 用户行为数据采集模块
  • 《统计学习方法》(李航)——学习笔记
  • 阿里云EMR集群搭建及使用
  • 学习streamlit-4
  • 高级Oracle DBA面试题及答案
  • 程序员成长路线
  • 【Galois工具开发之路】关于类的重新装载思路
  • 哪款蓝牙耳机音质好?内行推荐四款高音质蓝牙耳机
  • Android程序自动在线升级安装
  • JS的BroadcastChannel与MessageChannel
  • nextjs开发 + vercel 部署 ssr ssg
  • Good Idea, 利用MySQL JSON特性优化千万级文库表
  • 【python游戏制作】快来跟愤怒的小鸟一起攻击肥猪们的堡垒吧
  • ARM 学习(一)
  • 深入分析Java的序列化与反序列化
  • 、Tomcat源码分析-类加载器
  • 反转链表相关的练习(下)
  • 2.进程和线程
  • C++回顾(十四)—— 函数模板
  • 如何做好项目各干系人的管理及应对?