如何解决Lock wait timeout exceeded的问题
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要介绍"如何解决Lock wait timeout exceeded的问题",在日常操作中,相信很多人在如何解决Lock wait timeout exceeded的问题问题上存在疑惑,小编
千家信息网最后更新 2025年12月03日如何解决Lock wait timeout exceeded的问题
这篇文章主要介绍"如何解决Lock wait timeout exceeded的问题",在日常操作中,相信很多人在如何解决Lock wait timeout exceeded的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何解决Lock wait timeout exceeded的问题"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
背景
最近在排查问题时发现,偶尔会发生关于数据库锁超时的现象,会发生像如下的报错信息:
Exception in thread "pool-3-thread-1" org.springframework.dao.CannotAcquireLockException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction### The error may involve com.zr.center.mybatis.auto.mapper.UserMapper.updateByExampleSelective-Inline### The error occurred while setting parameters### SQL: update user SET user_name = ? WHERE ( user_id = ? )### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction; ]; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:262) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) at com.sun.proxy.$Proxy101.update(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:295) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:59) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) at com.sun.proxy.$Proxy103.updateByExampleSelective(Unknown Source) at com.zr.center.framework.web.service.BaseService.updateByExampleSelective(BaseService.java:97) at com.zr.center.api.test.service.TestService.updateUserName(TestService.java:34) at com.zr.center.api.test.service.TestService$$FastClassBySpringCGLIB$$bd3aa32.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.zr.center.api.test.service.TestService$$EnhancerBySpringCGLIB$$59b19302.updateUserName( ) at com.zr.center.ApplicationTests.lambda$testTxLockWaiting$0(ApplicationTests.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.Util.getInstance(Util.java:408) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
排查
经过排查,DBA给出的日志中并未有死锁,死锁的原因排除,查询业务日志发现在高并发的时期有时会有重复请求过来,也有一个服务在处理某个逻辑时会发一条mq消息,而同时会消费这条消息,此时也会导致锁超时。超时原因就是因为一个事务中处理的逻辑过多,有调外部服务(超时),有更新其它多张表的操作,这样就会导致后面事务请求超时,报以上错误。
重现步骤
数据库配置
关于配置信息查看,可以看到事务隔离是RR,事务锁等待时长为默认的50s

事务代码
/** * @description: 用户服务超时测试 * @author: chong guo * @create: 2018-12-10 14:44 */@Service@Slf4jpublic class TestService extends BaseService{ /** * 更新用户名称 * * @param userId * @param name */ @Transactional(rollbackFor = Exception.class) public void updateUserName(Long userId, String name) throws InterruptedException { log.info("开始更新用户名【{}】,用户ID为【{}】", name, userId); UserExample userExample = new UserExample(); userExample.createCriteria().andUserIdEqualTo(userId); User user = new User(); user.setUserName(name); super.updateByExampleSelective(user, userExample); // 模拟业务超时,有可能调用外部远程服务超时,也有可能处理其它逻辑 Thread.sleep(55000); log.info("结束更新用户名【{}】,用户ID为【{}】", name, userId); }}
模拟并发
/** * @author Chong Guo */@RunWith(SpringRunner.class)@SpringBootTest@Slf4jpublic class ApplicationTests { @Resource TestService testService; private final int threadCount = 5; @Test public void testTxLockWaiting() throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(threadCount); ExecutorService threadPool = Executors.newFixedThreadPool(300); for (int i = 0; i < threadCount; i++) { threadPool.execute(() -> { try { testService.updateUserName(611526166943105024L, "chongguo"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { countDownLatch.countDown(); } }); } countDownLatch.await(); threadPool.shutdown(); log.info("Test tx lock is over"); Thread.sleep(100000); }}运行代码后会现三次失败,二次成功,失败原因都是锁超时
到此,关于"如何解决Lock wait timeout exceeded的问题"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
问题
用户
事务
学习
更新
服务
原因
逻辑
处理
业务
代码
信息
数据
数据库
日志
更多
消息
用户名
死锁
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
大唐无双服务器是内部消息吗
app订制软件开发
网络安全宣全群众图片
网络技术支持面试回答
网络安全算热门行业吗
宜兴品牌软件开发销售
抚州市网络安全应急演练
滁州h3c塔式服务器
网络技术适合女生考研吗
第二次互联网大会 黑科技
交换机涉及到网络安全吗
郑州市信息网络安全协会
华为麒麟920服务器
eve服务器
ks云服务器挂机
虚拟机上数据库怎么存储的
江苏无锡网络安全技能大赛
网络技术与科学
比思维导图软件开发
信息量分析网络安全
mysql数据库优点
党统数据库
威海家和网络技术公司
软件开发类项目怎么收税
cmd网络技术学习
国产cpu小型服务器
长江海事局2019网络安全
凹凸网络软件开发公司
软件开发工作能干长久吗
网络安全教材大纲