mysql死锁导致的java报错Lock wait timeout exceeded; try restarting transaction

本文介绍了解决MySQL数据库中出现的Lock wait timeout exceeded错误的方法。通过查询information_schema.INNODB_TRX表定位死锁任务,并使用kill命令解决死锁问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做后台接口的时候,忽然发现无法对一批数据进行任何操作了,打开控制台,发现报错了,报错信息如下:"Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction..."很明显,这是mysql的报错,百度之后发现,原来是这批数据的上一次操作还没结束并且发生了死锁,所以直接kill掉这次操作就ok了。

解决步骤如下:

select * from information_schema.INNODB_TRX (information_schema这张数据表保存了MySQL服务器所有数据库的信息)

找到对应死锁的任务


kill掉它

kill trx_mysql_thread_id(7340)

就可以了

原文链接

### Java JDBC 批量插入 SQL 锁等待超时解决方案 当遇到 `Lock wait timeout exceeded` 的错误时,表明 MySQL 数据库中的 InnoDB 表在处理事务时遇到了锁等待超时问题。这通常发生在高并发环境下,多个事务尝试访问同一资源并相互阻塞。 #### 调整数据库配置参数 可以通过调整 MySQL 配置文件中的 `innodb_lock_wait_timeout` 参数来增加锁等待时间。默认情况下,此参数设置为 50 秒。对于某些应用来说,可能需要更长时间才能完成复杂的事务处理[^2]。 ```sql SET GLOBAL innodb_lock_wait_timeout = 120; ``` #### 修改应用程序逻辑设计 除了更改服务器端的配置之外,优化客户端的应用程序代码同样重要: - **减少持有锁的时间**:确保每次只锁定必要的最小范围的数据行,并尽快释放这些锁。 - **重试机制**:实现自动重试功能,在捕获到特定类型的异常(如 `SQLException`)之后重新执行失败的操作。需要注意的是要控制好最大重试次数以免陷入无限循环。 - **批量大小管理**:合理规划每批次插入的数量,过大的批处理可能会占用过多资源从而引发性能瓶颈甚至死锁现象。 - **隔离级别选择**:适当降低读取一致性要求可以有效缓解因频繁更新带来的竞争压力。例如将默认 READ COMMITTED 或者更低级别的 REPEATABLE READ 改成 READ UNCOMMITTED 可能有助于提高吞吐率但是同时也增加了脏读的风险,请谨慎评估业务需求后再做决定。 ```java public void batchInsert(List<Item> items) { int batchSize = 1000; // 控制单次提交数量 Connection conn = null; PreparedStatement pstmt = null; try { String sql = "INSERT INTO item (name, price) VALUES (?, ?)"; conn = dataSource.getConnection(); conn.setAutoCommit(false); pstmt = conn.prepareStatement(sql); for (int i = 0; i < items.size(); ++i) { Item item = items.get(i); pstmt.setString(1, item.getName()); pstmt.setDouble(2, item.getPrice()); pstmt.addBatch(); if ((i + 1) % batchSize == 0 || i == items.size() - 1){ pstmt.executeBatch(); // 清空当前批处理命令队列 pstmt.clearBatch(); // 定期提交以防止内存溢出 conn.commit(); } } conn.commit(); } catch (SQLException e) { if(conn != null){ try{ System.err.print("Transaction is being rolled back"); conn.rollback(); }catch(SQLException excep){} } throw new RuntimeException(e.getMessage(),e); } finally { closeResources(pstmt,conn); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值