【问题标题】:What is the behavior of Java ResultSet when another process is writing to the same table at the same time?当另一个进程同时写入同一个表时,Java ResultSet 的行为是什么?
【发布时间】:2021-03-20 14:50:55
【问题描述】:

如果我有一个简单的 Java 程序,它会生成一个准备好的语句来执行 SQL,比如

select * from person 

并且这个准备好的语句返回一个ResultSet,如果另一个进程同时向person表写入行,那么在遍历结果集时会发生什么行为?

例如,新添加的行在以下循环中是否可见

while (resultSet.next()) {
    // Some processing 
    // Which might take a while
}

我在别处读到,可以使用setFetchSize 来控制结果集中返回的行数。

如果我使用这种方法,这会改变答案吗? (假设行的写入速度比读取和处理的速度快)

【问题讨论】:

    标签: java database postgresql resultset


    【解决方案1】:

    来自 Oracle 文档:

    您通过游标访问 ResultSet 对象中的数据。 请注意,此游标不是数据库游标。此游标是指向 ResultSet 中的一行数据的指针。最初,游标位于第一行之前。 ResultSet.next 方法将光标移动到下一行。如果光标位于最后一行之后,则此方法返回 false。该方法通过 while 循环重复调用 ResultSet.next 方法,以遍历 ResultSet 中的所有数据。

    见:https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html


    关于你的第二个问题:

    What and when should I specify setFetchSize()?

    所以不,设置要分配多少堆的大小不会改变语义。

    【讨论】:

      【解决方案2】:

      原则上这将取决于驱动程序的实现。然而实际上,驱动程序要么将整个结果集加载到内存中,要么使用 db 游标将更多结果提取到集合中。

      在这两种情况下,并行发生的插入都是不可见的。数据库游标通常不会看到创建后提交的插入。

      【讨论】:

        猜你喜欢
        • 2020-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 2011-12-12
        • 1970-01-01
        • 2012-05-04
        • 2017-09-07
        相关资源
        最近更新 更多