【问题标题】:MYSQL SELECT ... FOR UPDATE Not working?MYSQL SELECT ... FOR UPDATE 不工作?
【发布时间】:2011-05-17 19:13:16
【问题描述】:

我在使用 MySQL 的 SELECT .. FOR UPDATE 时遇到问题,这是我要运行的查询:

SQL = "SELECT * " +
      "FROM " + TableName + " " + 
      "WHERE out_status IN ("+outSStatus+") AND queued <= NOW() " +
      "ORDER BY out_status, id_queue ASC "+ limitSql+
      "FOR UPDATE";

在此之后,线程将执行 UPDATE 并将 out_status 更改为 99,然后它应该解锁该行。

我正在运行一个多线程 java 应用程序,因此 3 个线程正在运行此 SQL 语句,但是当线程 1 运行它时,它不会锁定(隐藏)线程 2 和 3 的结果。因此线程 2 和 3得到相同的结果。

每个线程都在自己的mysql连接上。

有人可以帮我解决这个问题吗?或者也许有更好的解决方案?

非常感谢。

【问题讨论】:

    标签: java sql mysql select jdbc


    【解决方案1】:

    我遇到了类似的问题。来自@Vikash 和@Adeel Ansari 的两个答案都是有效的建议。但是,我通过使用InnoDB 引擎而不是MyISAM 解决了这个问题。 MyISAM 只允许锁定在表级别,而不是在行级别。使用InnoDB时,您仍然需要事务。

    【讨论】:

      【解决方案2】:

      它可能正在工作,而您无法注意到。假设线程 1 执行了语句,并自动提交了事务,因为 auto-commit 已打开。那么当然线程 2 也可以运行它。

      尝试关闭auto-commit,使用Connection类的this method,然后查看结果。

      【讨论】:

      • 我设置了 auto-commit = off ... 有了上述情况,我还需要使用事务才能让它工作吗?例如:开始和提交
      • @James:好的,但至少它开始工作了。我建议你可以接受 Vikash 的回答。
      【解决方案3】:

      您可以使用transactions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 2018-03-27
        相关资源
        最近更新 更多