ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction的问题解决

今天创建了几张表,建立了外键关联关系,我使用的是Navicat Premium 12,开启了手动提交事务(之前都是自动提交),所以改动了数据之后忘记手动提交事务了,表处于锁定状态。关联表插入数据是,提示关联的字段值不对应,我就纳闷了,刚添加的数据,怎么回事,这次操作,直接导致主表长时间未响应锁死!

MySQL中外键的介绍:
MySQL外键必须使用存储引擎为 innDB 其中MySAM 和MEMORYH这两种引擎不支持
由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
设置外键约束的两个表之间会具有父子关系,即子表中外键的字段的取值范围由父表所决定
设置外键一定程度上降低数据库的速度
子表的外键字段的数据类型和父表中要一致

网上一通查询,解决方式整理如下

第一步:

因为mysql数据库默认是autocommit的自动提交,那就先查看一下数据库的设置是否真的是自动提交。

select @@autocommit;

在这里插入图片描述
确定是自动提交,那么就没有问题,为了进一步的确定问题,我们需要先知道MYSQL数据库的information_schema 库中三个关于锁的表(MEMORY引擎);

innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系

先查看数据库的事务隔离级别:

select @@tx_isoloation;

REPEATABLE-READ // MySQL默认的事务隔离级别就是REPEATABLE-READ

在这里插入图片描述

然后查看当前数据库的线程情况:

SHOW FULL PROCESSLIST;

在这里插入图片描述
没有看到正在执行的很慢SQL记录线程,再去查看innodb的事务表INNODB_TRX,看下里面是否有正在锁定的事务线程,看看ID是否在show full processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。

最后查看当前数据库的lock进程

SELECT * FROM information_schema.INNODB_TRX;

在这里插入图片描述
发现有id为616694的sql,需要手动kill掉

KILL 616694;

在这里插入图片描述
kill完成之后再查询一遍,确保没有进程之后,再重新操作表即可通过。

别忘了之前未提交的事物提交一下!

总结:
其实只需要最后一步操作即可完美解决,但是我也是从前往后慢慢发现的,所以,按需执行。

转载请注明出处!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值