问题出现环境:
- 在同一事务内先后对同一条数据进行插入和更新操作;
- 多台服务器操作同一数据库;
- 瞬时出现高并发现象。
原因分析:
- 在高并发的情况下,Spring事物造成数据库死锁,后续操作超时抛出异常;
- Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。
可以先参考博客:https://blog.csdn.net/java__project/article/details/100137526
若问题还没有得到解决,可以继续阅读下面内容。
解决方案
一、重启MySQL服务
二、增加锁的等待时间,时间是(s)
mysql> set innodb_lock_wait_timeout=100
mysql> set global innodb_lock_wait_timeout=100
查看结果:
mysql> show variables like ‘innodb_lock_wait_timeout’;

三、在MySQLcli中检查数据库事务隔离级别
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;

可以通过修改隔离级别来优化数据库操作,使用READ COMMITTED来代替REPEATABLE READ(InnoDB默认值)
mysql> set tx_isolation = ‘READ-COMMITTED’;
mysql> set global tx_isolation = ‘READ-COMMITTED’;
重新编译项目文件,问题得到解决。
当遇到'Lock wait timeout exceeded; try restarting transaction'的错误时,可能是因为高并发导致数据库死锁。解决方案包括:重启MySQL服务、增加innodb_lock_wait_timeout的等待时间、检查并调整事务隔离级别至READ-COMMITTED。通过这些措施,可以有效处理锁等待超时问题。

1543

被折叠的 条评论
为什么被折叠?



