2016-02-16 32 views
0

我正在使用SQL表來維護我的應用程序狀態。在多線程環境中選擇後更新表

最初我是從我的表使用select查詢提取新的密鑰,然後更新存在狀態爲「拿起」

我現在正在一個多線程的環境。多線程環境中的問題是多次提取相同的密鑰。系統狀態變得不穩定。我曾嘗試使用同步但它不工作。我認爲有可能是一個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

在UPDATE語句中使用的條件"WHERE id=" + rowId + " AND status = 0"

如果更新計數返回通過Statement.executeUpdate是0,那麼你知道另一個線程同時選擇了這個id,你可以在當前線程中忽略它。

+0

這解決了這個問題,但是有沒有一個SQL特定的解決方案,我認爲這將有較少的開銷。例如:返回我更新的行的id。 – Count

+0

@Count什麼意思*返回我更新的行的ID *? – wero

+0

我對SQL不太滿意,但我的意思是「如果我可以選擇使用我的更新查詢更新的行的ID」 – Count