一、问题描述
偶发性的Update语句失败
[SQL] UPDATE work_queue SET state1=1,state2=1 where state1=0 AND id IN (SELECT id FROM plan_queue WHERE work_window IN (1,2,3,4));
[Err] 1205 - Lock wait timeout exceeded: try restarting transaction
二、基础知识点
1、查看数据库的进程信息
SHOW FULL PROCESSLIST;
2、关闭指定进程
-- KILL Id
KILL 11173;
三、解决方案
1、检查应用程序(客户端、WEB端)
- 程序内部访问\操作数据库时出现死锁
- 程序内部抛出异常未对连接进行最终的关闭处理
try
{
//Open Connection / Session
//Execute SQL Command ,read Data
//Close DataReader
//Close Connection / Session
}
catch(Exception exp)
{
//Close Connection / Session
}
finally
{
//Close Connection / Session
}
2、检测触发器、定时器
触发器:触发器内使用了耗时(数据量过大的因素的考虑)的处理语句、使用了死循环的插入、更新、删除语句,导致死锁/卡锁。
定时器:定时器使用了存储过程、函数,存储过程、函数中包含了耗时(数据量过大的因素的考虑)的处理语句,导致死锁/卡锁。
优化语句、删除冗余的语句。
3、开启事务自动提交
检测事务是否为自动提交,mysql默认是自动提交的
- 1 - 自动提交
- 0 - 手动提交
查看命令
SELECT @@autocommit;
设置命令
SET GLOBAL autocommit=1;