繁体   English   中英

MYSQL锁等待超时超过更新SQL上的错误

[英]MYSQL Lock wait timeout exceeded error on update sql

订单项目表
order_item_id
order_id
数量
单价
运费价格
business_id
工作流程编号
delivery_id
item_id

订单表
billing_address_id
shipping_address_id
付款方式
total_price
运费价格
顾客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块中再次将自动提交模式设置为true。 之后,我们没有看到此错误。

要点1:您不应使用应用程序中的join更新查询,而是获取主键,然后基于主键更新表。

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

要点3:如果由于某些特定原因仍然要基于连接进行更新,并且查询得到了优化,则需要更改wait_timeout变量。 因此,请检查服务器上此变量中设置的值。 您可以通过以下命令进行检查-

SHOW GLOBAL VARIABLES LIKE 'wait_timeout';

运行UPDATE查询之前的一件好事是运行相同的SELECT。

SELECT * FROM `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 = ? 

只是为了确保您正在更新右行。 您也可以对该查询运行EXPLAIN,以了解它对数据库的复杂程度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM