2016-11-22 22 views
1

以下SELECT查詢的意外行爲在我的Java代碼的邏輯:後UPDATE

con.setAutoCommit(false); 
int starIndex = 0; 
List Details = new ArrayList(); 

    while (true) { 
        isRsEmpty = true; 
        String my_Query = "select * from x,y,z where" 
          + " x.a = y.b" 
          + " x.a = z.c" 
          + "y.b = z.e" 
          + " ORDER BY a ASC" 
          + " limit 5" 
          + " offset " + starIndex; 


        preparedStatement = con.prepareStatement(my_Query); 
        rs = preparedStatement.executeQuery(); 

        while (rs.next()) { 
         isRsEmpty = false; 

       //Other processing steps 


         starIndex++; 
         Details.add(rs.getInt("id")); 
        } 

        if(isRsEmpty){ 
         starIndex = 0; 
        } 


        Iterator itr = Details.iterator(); 
        String updateTable = "UPDATE x SET status = ? where i = ? and j = ? and k = ?"; 
        updatePreparedStatement = con.prepareStatement(updateTable); 

        while (itr.hasNext()) { 

         updatePreparedStatement.setInt(1, 1); 
         updatePreparedStatement.setString(2, "zzz"); 
         updatePreparedStatement.setInt(3, 9); 
         updatePreparedStatement.setInt(4, 10); 
         updatePreparedStatement.addBatch(); 


        } 

        updatePreparedStatement.executeBatch(); 
        con.commit(); 
        Details.clear(); 
    } 

的問題

我在我的表,該表符合選擇查詢13項。

當我第一次運行查詢時,我的限制是5,偏移量是0,我從表中正確地得到了5條記錄,所選的5條記錄被更新。

當選擇查詢再次運行時對錶進行更新後,它給了我3條記錄。 這是意外的因爲我有更多的8個記錄留在表中。再次更新3條記錄。

再次當選擇查詢運行它給我0記錄。

然後再運行一個select查詢,它給了我5條記錄並更新了5條記錄。

我無法理解此行爲。如果我運行我的select查詢而沒有更新,那麼它運行正確,它給了我5,5,3條記錄,但用上面的邏輯它給了我5,3,0,5條記錄。

這裏有什麼問題?

注意:在上面的程序中,所有像PreparedStatement和其他變量都被正確聲明。

謝謝

+0

這是因爲你缺少p,q,r – e4c5

+0

爲什麼你沒有選擇所有的東西並且在執行之前將你的批量限制在5個循環?請提供可重現的內容,添加表格結構的樣本,... – AxelH

回答

0

有沒有缺少任何機會「和」選擇查詢條件的關鍵字之間?

String my_Query = "select * from x,y,z where" 
         + " x.a = y.b" 
         + " AND x.a = z.c" 
         + " AND y.b = z.e" 
         + " ORDER BY a ASC" 
         + " limit 5" 
         + " offset " + starIndex; 

我不知道這是否會解決問題,但我覺得它很奇怪,它的工作原理是這樣的。