以下是我的java代码中的逻辑:
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条记录。
再次运行select查询时,它会给我0条记录。
然后再次运行一个选择查询,它会给我5条记录并更新5条记录。
我无法理解这种行为。如果我在没有更新的情况下运行我的选择查询,那么它运行正确,这给了我5,5,3条记录,但是使用上面的逻辑,它给了我5,3,0,5条记录。
这里有什么问题?
注意:在上面的程序中,所有变量如PreparedStatement和其他变量都被正确声明。
谢谢
答案 0 :(得分: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;
我不知道这是否可以解决这个问题,但我发现这样做很奇怪。