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和其他變量都被正確聲明。
謝謝
這是因爲你缺少p,q,r – e4c5
爲什麼你沒有選擇所有的東西並且在執行之前將你的批量限制在5個循環?請提供可重現的內容,添加表格結構的樣本,... – AxelH