订单项目表
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/