jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
背景
spring boot项目中,service1中的func1调用了service2中的func2方法。如下:
service1:
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) @Override public boolean func1() { //1.执行数据库操作 //1.1 执行数据库insert操作 insert(model); //1.2 获得自增id id=model.getId(); //2.调用sercice2的func2方法 service2.func2(id) }
service2:
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) @Override public boolean func2(Long id) { //更新 try{ //按id执行更新操作 update table set colname=value where 主键=id; }catch(Exception ex){ //捕获日志并记录 log.error(ex); } }
报错详情
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:73) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
原因分析
因为两个是独立事物,同时Mysql数据库的隔离级别是默认的可重复读。这就导致,service1.func1
开启的事物(我们称其为事物1),插入数据库,还没提交时,此时被插入的行处于被锁定状态;service1.func2
开启的新事物(我们称其为事物2),因为不在同一个事物中,需要等待被插入的行解锁,即需要等待事物1提交完事物后,才能更新。
这个时候,问题已经很明显了。事物1还在等待事物2的函数返回结果,然后才提交。那么,结果只能是事物2和事物1都无限期等待下去,即死锁--》出发数据库对死锁的处理方式:超时检测--》抛出异常。
MySQL默认的锁超时等待为50s,可以通过innodb_lock_wait_timeout 参数查看和修改。
show VARIABLES like '%innodb_lock_wait_timeout%' ;
即如果数据库锁超过50s还未被释放,则会触发该超时机制,抛出错误并回滚。
解决办法
方案1:如无必要,将事物1和事物2合并为同一个事物
方案2:如无法合并,则改为事物1提交(如手动显示提交)后再调用事物2。
标签:
事物
, spring boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2016-10-18 MySQL Workbench “Error Code: 1175”