InnoDB锁等待超时时间增加超时时间。

9
我正在使用 MySQL 数据库,尝试在插入记录后更新数据,但是我遇到了以下错误:ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction。所以我通过以下查询降低了超时时间:
set GLOBAL innodb_lock_wait_timeout=1

所以我的问题是:这样做可以吗?会导致其他问题,如性能问题等吗?
感谢您的帮助。
1个回答

13

如果这是一个网络应用程序,并且您正试图从一个页面挂起事务到下一个页面,请不要这样做,它不会起作用。

“刚刚之后”是什么意思?如果在两个语句之间什么也没做,那么即使等待1秒的超时时间也足够大了。

mysql> SET GLOBAL innodb_lock_wait_timeout = 1;
mysql> SELECT @@innodb_lock_wait_timeout;
+----------------------------+
| @@innodb_lock_wait_timeout |
+----------------------------+
|                         50 |
+----------------------------+
mysql> SET SESSION innodb_lock_wait_timeout = 1;
mysql> SELECT @@innodb_lock_wait_timeout;
+----------------------------+
| @@innodb_lock_wait_timeout |
+----------------------------+
|                          1 |
+----------------------------+

关于全局变量和会话变量的解释:当您连接开始时,全局值用于初始化会话值。之后,您可以更改会话值以影响您所做的操作。而更改全局值对您当前的连接没有影响。

一旦您理解了全局变量和会话变量之间的区别,将超时时间更改为1非常安全。唯一改变的是获取该错误的频率。


至少对于我在MySQL 5.6上,它没有奏效:Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@innodb_lock_wait_timeout; +----------------------------+ | @@innodb_lock_wait_timeout | +----------------------------+ | 50 | +----------------------------+ 1 row in set (0.00 sec) - Ain Tohvri
1
@AinTohvri - 注意 GLOBALSESSION 的区别。 - Rick James
我将两个变量都改为1,但第二个事务仍需要50秒才能超时,而第一个事务锁定了表中相同的行。您能否解释一下为什么“如果这是一个Web应用程序,并且您正在尝试从一个页面挂起事务到另一个页面,请不要这样做;它不会起作用。”?谢谢@RickJames - David
@David - Web 服务器每次调用都会重新启动。除非在外部保存,否则无法从一个页面保存到下一个页面。保存信息的位置:文件、cookies、数据库。当连接断开时,数据库事务也会消失。当网页终止时,连接也会终止。 - Rick James
1
@TomášFejfar - 请开一个新的问题并提供您的具体情况。请在交易内部包含代码,说明何时和在哪里设置超时等等。(我担心我们没有看到这个问题和您的情况之间的微妙差别。) - Rick James
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接