当另一个进程同时写入同一个表时,java resultset的行为是什么?

7gs2gvoe  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(233)

如果我有一个简单的java程序,它生成一个准备好的语句来执行sql

select * from person

这个准备好的语句返回一个 ResultSet ,如果另一个进程正在向结果集写入行,则遍历结果集时的行为是什么 person 同时坐在table上?
例如,新添加的行在下面的循环中是否可见

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

我在别处读到有可能使用 setFetchSize 控制结果集中返回的行数。
如果我用这个方法,这会改变答案吗(假设行的写入速度比读取和处理速度快)

ulmd4ohb

ulmd4ohb1#

从oracle文档:
您可以通过光标访问resultset对象中的数据。请注意,此游标不是数据库游标。此游标是指向结果集中一行数据的指针。最初,光标位于第一行之前。方法resultset.next将光标移动到下一行。如果光标位于最后一行之后,则此方法返回false。此方法使用while循环重复调用resultset.next方法,以遍历resultset中的所有数据。
请参见:https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html
关于你的第二个问题:
我应该在什么时候指定setfetchsize()?
因此,设置要分配多少堆的大小不会改变语义。

x6492ojm

x6492ojm2#

原则上,这将取决于驱动程序的实现。但实际上,驱动程序要么将整个结果集加载到内存中,要么使用db游标将更多结果提取到集合中。
在这两种情况下,并行发生的插入都是不可见的。数据库游标通常看不到创建后提交的插入。

相关问题