我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
当前回答
迟到的派对(像往常一样),但我的问题是我写了一些糟糕的SQL(作为一个新手)和几个进程对记录有一个锁<-不确定适当的措辞。我最终不得不:SHOW PROCESSLIST,然后使用kill <id>杀死id
其他回答
完全符合MarkR的说法。自动提交使每个语句成为一个语句事务。
SHOW ENGINE INNODB STATUS会给你一些死锁原因的线索。还要仔细查看慢速查询日志,看看还有什么正在查询表,并尝试删除正在执行满表罐操作的任何内容。行级锁定工作得很好,但当您试图锁定所有行的时候就不行了!
迟到的派对(像往常一样),但我的问题是我写了一些糟糕的SQL(作为一个新手)和几个进程对记录有一个锁<-不确定适当的措辞。我最终不得不:SHOW PROCESSLIST,然后使用kill <id>杀死id
在我们的案例中,这个问题与锁本身没有太大关系。
问题是我们的一个应用程序端点需要并行打开2个连接来处理单个请求。
例子:
打开第一个连接 开始事务1 锁定表1中的一行 打开第二个连接 启动事务2 锁定表2中的一行 提交事务2 释放第二个连接 提交事务1 释放第一个连接
我们的应用程序的连接池限制为10个连接。
不幸的是,在负载下,一旦所有连接都被使用,应用程序就停止工作,我们开始遇到这个问题。 我们有几个请求需要打开第二个连接才能完成,但由于连接池的限制而无法完成。因此,这些请求长时间保持对table1行的锁定,导致接下来需要锁定同一行的请求抛出此错误。
解决方案:
在短期内,我们通过增加连接池限制修补了这个问题。 从长远来看,我们删除了所有嵌套连接,以完全解决问题。
小贴士:
您可以通过尝试将连接池限制降低到1并测试应用程序来轻松检查是否有嵌套连接。
mysql->SHOW PROCESSLIST;
kill xxxx;
然后杀了睡着的那个。对我来说是2156。
如何强制解锁MySQL中锁定的表:
像这样打破锁可能会导致数据库中的原子性不被强制用于导致锁的sql语句。
这很棘手,正确的解决方案是修复导致锁的应用程序。然而,当美元处于危险之中时,迅速的一脚将使事情再次启动。
1)进入MySQL
mysql -u your_user -p
2)让我们看看锁定的桌子列表
mysql> show open tables where in_use>0;
3)让我们看看当前进程的列表,其中一个正在锁定你的表
mysql> show processlist;
4)终止其中一个进程
mysql> kill <put_process_id_here>;