惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
博客园 - 司徒正美
L
LangChain Blog
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
Stack Overflow Blog
Stack Overflow Blog
Engineering at Meta
Engineering at Meta
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
月光博客
月光博客
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net

博客园 - 谁是菜鸟?

mysql数据区分大小写 css hack java 乱码 panic user 44/45 window.onbeforeunload(支持firefox,ie,Safari) 配置SFS2.x的调试环境 mysql异常处理 常用linux命令 x86_64-unknown-linux - 谁是菜鸟? - 博客园 mysql 动态sql memcached资料 js ping - 谁是菜鸟? - 博客园 mysql roll back 为没有自动增长列的表添加自动增长列并更新现有数据 SmartFox Server 控制pubMsg - 谁是菜鸟? mysql 命令 java.util.ConcurrentModificationException RenRen应用接入样例 - 谁是菜鸟? - 博客园 jxl read and write excel
Lock wait timeout exceeded; try restarting transaction
谁是菜鸟? · 2010-12-03 · via 博客园 - 谁是菜鸟?

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;