【问题标题】:MYSQL Lock wait timeout exceeded error on update sqlMYSQL Lock wait timeout exceeded 更新 sql 错误
【发布时间】:2015-10-29 02:06:54
【问题描述】:

订单商品表
order_item_id
order_id
数量
单位价格
运费
业务 ID
工作流_id
Delivery_id
item_id

订单表
billing_address_id
shipping_address_id
付款方式
总价
运费
客户 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。之后我们没有看到这个错误。

【问题讨论】:

    标签: java mysql timeout deadlock


    【解决方案1】:

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

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

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

    SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
    

    【讨论】:

      【解决方案2】:

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

      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 以了解它对您的数据库有多复杂。

      【讨论】:

        猜你喜欢
        • 2016-09-13
        • 2018-08-30
        • 1970-01-01
        • 2011-06-14
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多