java - 更新sql时MYSQL锁等待超时超出错误

标签 java mysql timeout deadlock

订单项目表
order_item_id
order_id
数量
单价
运费
业务_id
工作流程_id
送货_id
item_id

订单表
billing_address_id
Shipping_address_id
付款方式
总价
运费
customer_id

UPDATE `order_items` t1 INNER JOIN Orders t2 ON t2.order_id = t1.order_id SET t1.workflow_id = ?  WHERE t1.order_item_id = ? and t2.order_id = ? and t2.customer_id = ? and t1.delivery_id = ? 

UPDATE `order_items` t1 SET t1.workflow_id = ?
           WHERE t1.order_item_id = ? and t1.business_id = ? and t1.delivery_id = ?

UPDATE `order_items` t1 INNER JOIN Orders t2 ON t2.order_id = t1.order_id SET t1.workflow_id = ? WHERE t1.order_item_id = ?  and t2.order_id = ? and t1.delivery_id = ?"

这些查询是在我的 java Rest 服务的不同场景下触发的。 (在任何时间点,只会使用一个查询)。 以前我没有在更新 sql 中使用内连接,而且效果很好。

现在,在我修改查询后,它抛出以下异常,并且查询被卡住并且一分钟都没有返回。

   java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)

更新

发生这种情况是因为我们忘记在finally block 中再次将自动提交模式设置为true。之后我们就没有看到这个错误。

最佳答案

第一点:您不应该在应用程序中使用联接更新查询,而是获取主键,然后根据主键更新表。

Point2:显示带有索引的表结构,您可以通过“show create table mytable”命令获取详细信息,以便检查您的更新查询是否优化。

第三点:如果由于任何特定原因您仍然想基于连接进行更新并且您的查询已优化,则需要更改您的 wait_timeout 变量。因此,请检查服务器上此变量中设置的值。你可以通过下面的命令检查 -

SHOW GLOBAL VARIABLES LIKE 'wait_timeout';

关于java - 更新sql时MYSQL锁等待超时超出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847060/

相关文章:

java - 如何创建仅包含列标题、不添加行的 JTable

java - Java 中的任何 CSV Api,可以在大于 1 Gb 的 CSV 文件中来回遍历

python - 在 Django 中,迁移未应用于数据库

iphone - 如何手动设置连接超时?

java - Hibernate,在计数中使用具有多个列的不同

java - 在哪里可以找到数据文件夹(正在处理)

java - 将 CMS 签名写入可读文件

php - 从 php 列表中隐藏已使用的类别

Azure 应用服务在空闲后超时,即使勾选了 'always on'

oracle - 事务超时在 Oracle 的 Hibernate 上不起作用