我遇到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&amp;中锁定(隐藏)它的结果。因此,线程2&amp; 3得到了相同的结果。
此外,每个线程都有自己的mysql连接。
有人可以帮帮我吗?或许还有更好的解决方案?
非常赞赏。
答案 0 :(得分:2)
我有类似的问题。来自@Vikash和@Adeel Ansari的答案都是有效的建议。但是,我使用InnoDB
引擎代替MyISAM
解决了该问题。 MyISAM
仅允许在表级别上锁定,而不是在行级别上。使用InnoDB
时,您仍需要交易。
答案 1 :(得分:1)
您可以使用transactions
答案 2 :(得分:1)
它可能正在工作,你无法注意到。假设线程1执行了该语句,并自动提交了事务,因为auto-commit
已启用。当然,线程2也可以运行它。
尝试使用auto-commit
类的this method关闭Connection
,然后查看结果。