问题:Lock wait timeout exceededtry restarting transaction
MySQL版本:5.6.44
官方文档
意思是:InnoDB在锁等待超时过期时报告此错误。等待时间过长的语句被回滚(而不是整个事务)。如果SQL语句需要等待其他事务完成的时间更长,则可以增加 innodb_lock_wait_timeout 配置选项的值;如果太多长时间运行的事务导致锁定问题并降低繁忙系统上的并发性,则可以减少该选项的值。
锁等待超时,可能是出现了死锁,也可能有事务长时间未提交
库:information_schema
表:
查看各表信息
innodb_trx 表
innodb_locks 表
innodb_lock_waits 表
processlist 表
模拟出现死锁
准备一张只有主键的表:t_test (id)
Navicat 新建查询1
Navicat 新建查询2
检查是否锁表
查询当前正在执行的事务
查询当前出现的锁
查询锁等待对应的关系
查询等待锁的事务所执行的SQL
最后,事务2 等待锁超时报错: Lock wait timeout exceededtry restarting transaction
通过事务线程ID查找进程信息
win10 查看端口信息
目测不是因为存储过程内sql导致的死锁:因为存储过程内只有一条insert语句会持有锁,也只持有一把锁。所以不会导致死锁。
引起死锁肯定是由于资源共享冲突,事务是保证一个 *** 作单元能执行顺利或失败,保证数据的完整性的。
对于资源冲突肯定是需要锁来控制,也就是使用数据的隔离机制和同步锁来控制的,数据库的隔离机制修改影响会比较大,所以建议在dao层使用同步或者加锁来防止deadlock
但是可能会影响部分性能
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)