UPDATE后SELECT查询的意外行为

时间:2016-11-22 14:08:33

标签: java mysql

以下是我的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和其他变量都被正确声明。

谢谢

1 个答案:

答案 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;

我不知道这是否可以解决这个问题,但我发现这样做很奇怪。