博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lock wait timeout exceeded; try restarting tran...
阅读量:7030 次
发布时间:2019-06-28

本文共 893 字,大约阅读时间需要 2 分钟。

hot3.png

mysql出现:Lock wait timeout exceeded; try restarting transaction

什么问题导致的呢?绝对是程序的问题,因为另一个线程锁住了表或者记录导致后来到请求无法完成。

如何产生的:

表A

存储过程B

DELIMITER $$

DROP PROCEDURE IF EXISTS `B` $$

CREATE PROCEDURE `B`( )
BEGIN
SET autocommit=0;

select * from A where id=1 for update;

.......

commit;
END $$

DELIMITER ;

 

存储过程C

DELIMITER $$

DROP PROCEDURE IF EXISTS `C` $$

CREATE PROCEDURE `C`( )
BEGIN
select * from A where id=1 for update;

........

END $$

DELIMITER ;

 

 

当调用完B以后(autocommit=0),调用c(此时该记录被锁定,因为没有commit该锁就一直在,造成了全局的死锁.这里其实还是代码问题,因为在autocommit=1的情况下for update 实际上是不起作用的),此后无论任何地方再来锁A表的记录的时候就会出这个超时的异常。

autocommit是connection级别的变量,但是锁确实全局的(select @@autocommit;),在我们使用数据库连接池的情况下,connection.close()其实只关闭了所有的statement,

所以当同一个connection调用了B以后再去调用C.造成了一个全局的锁。

如果只是想加锁的范围在特定的语句,则应该使用START TRANSACTION语句:

START TRANSACTION;
 
select * from A where id=1 for update;
。。。
COMMIT;

转载于:https://my.oschina.net/sansom/blog/123364

你可能感兴趣的文章
理解CPU分支预测,提高代码效率
查看>>
javascript调试接口
查看>>
Python基础系列:初识python引用计数与弱引用
查看>>
javascript继承方法以及优缺点
查看>>
tab 切换下划线跟随实现
查看>>
20+个很棒的Android开源项目
查看>>
跨域、vue双向绑定相关面试题
查看>>
Web Components(一)入门
查看>>
mpvue打包没有app.json等配置文件的解决方法
查看>>
树莓派配置swoole环境
查看>>
JavaScript 工作原理之十二-网络层探秘及如何提高其性能和安全性
查看>>
搭建基于react项目的心得
查看>>
react-native踩坑记录
查看>>
HTTP API 设计入坑指南(一)
查看>>
OkHttp源码分析
查看>>
【挖坑系列】跨域问题相关
查看>>
使用cronolog切割nginx访问日志,定时清理旧日志
查看>>
PHP最常用函数TOP100(翻译)
查看>>
大数据科学新发展展望:不得不知的四大趋势
查看>>
python多线程、锁、event事件机制的简单使用
查看>>