在多线程环境中选择后更新表

时间:2016-02-16 09:59:32

标签: java mysql sql multithreading

我正在使用SQL表来维护我的应用程序。

最初我使用select查询从我的表中提取新密钥,然后将状态更新为“拾取”

我现在正转向多线程环境。多线程环境中的问题是多次提取相同的密钥。系统状态变得不稳定。我尝试过使用synchronized但它不起作用。我相信我的问题可能只有一个SQL解决方案,但是附加了java代码

以下是我的代码

sql ="select "+idField+",id from `tableName` where finish_time is NULL and status = 0 order by init_time limit 1";

    Statement statement;
    statement = connection.createStatement();
    synchronized (this) {
        ResultSet rs = statement.executeQuery(sql);
        if (rs.next()) {
            bId = rs.getString(1);
            rowId = rs.getString(2);
        }

        sql1 = "UPDATE `tableName` SET `pick_up_time`=Now(),`status`=1 WHERE `id`="
                + rowId;
        executeQuery(sql1);

1 个答案:

答案 0 :(得分:1)

在UPDATE语句中,使用条件"WHERE id=" + rowId + " AND status = 0"

如果Statement.executeUpdate返回的更新计数为0,那么您知道另一个线程同时选择了该ID,您可以在当前线程中忽略它。