“Lock wait timeout exceeded; try restarting transaction” 是 MySQL 中常见的错误,通常表示在事务执行过程中,等待锁的时间超过了系统设定的默认锁定超时时间。以下是可能导致此错误的原因及解决方法:
- 并发访问:多个事务同时尝试锁定同一数据,导致其中一个事务等待其他事务释放锁,超时时间到达后抛出此错误。
- 死锁:两个或多个事务互相等待对方释放相同资源的锁,从而造成的死循环,也会引发此错误。
- 长时间运行的查询或事务:如果某个事务或查询执行时间过长,其他事务等待其释放锁时可能会超时。
- 高并发情况下的数据库死锁:在高并发情况下,Spring 事务可能导致数据库死锁,后续操作超时抛出异常。
解决方法
- 调整超时参数:
在MySQL中,innodb_lock_wait_timeout
参数用于设置事务等待行锁的最长时间。如果事务等待时间超过这个值,事务将会被回滚。默认情况下,该参数的值为50秒。以下是如何查看和修改这个参数的详细步骤:
查看
innodb_lock_wait_timeout
参数
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
这条命令会返回当前的innodb_lock_wait_timeout
值。
直接查看MySQL的配置文件(通常是my.cnf
或my.ini
),找到[mysqld]
部分,查看是否有innodb_lock_wait_timeout
的设置。
修改
innodb_lock_wait_timeout
参数
可以使用以下SQL命令临时修改该参数:
SET GLOBAL innodb_lock_wait_timeout = 你的值;