【问题标题】:Reset cursor position after ResultSet updateRow在 ResultSet updateRow 之后重置光标位置
【发布时间】:2013-10-21 22:01:00
【问题描述】:

由于某种原因,当调用updateRow(我也在插入和删除行)时,Oracle JDBC 驱动程序可能会将ResultSet 游标移动到其他位置(不是到同一行,也不是到下一行)。我怎样才能避免这个问题?

注意:结果按表的主键排序(我已在 SQL 中指定)。但我越来越怀疑“order by”子句不能正常工作。

【问题讨论】:

  • 要将光标重置到哪里?
  • 只是一个想法:你选择for update吗?我知道代码示例没有显示它,但在 PL/SQL 或通过其他 API 中使用的方法是将游标打开为 select for update,然后更新 where current of <cursor>。我会假设甲骨文“在幕后”这样做。
  • “下一行”由您的 order by 子句定义。你能设置一个简单的 pl/sql 块来打开游标并循环遍历行吗?您应该会发现结果与通过 jdbc 驱动程序的顺序相同(至少很容易对此进行测试)。如果您需要示例 pl/sql 代码,请告诉我

标签: oracle jdbc oracle11g


【解决方案1】:

【讨论】:

  • 第二个和第三个链接中的代码示例强烈暗示它保持在同一行 - 至少在仅执行更新时 - 否则代码示例将没有意义。但它并不总是保持在同一行。此外,这实际上并不能解决我的问题。
【解决方案2】:

只转发可更新的结果集维护一个只能在一个方向(向前)移动的游标,也可以更新行。这必须使用并发模式ResultSet.CONCUR_UPDATABLE 和类型ResultSet.TYPE_FORWARD_ONLY 创建。

注意:默认类型为ResultSet.TYPE_FORWARD_ONLY

更改的可见性 对只进结果集进行更新或删除后,结果集的游标不再位于刚刚更新或删除的行上,而是紧接在结果集中的下一行之前(需要移动到下一行之前允许任何进一步的行操作)。这意味着ResultSet.updateRow()ResultSet.deleteRow() 所做的更改永远不可见。 如果插入了一行,即使用ResultSet.insertRow(),则它可能在仅向前的结果集中可见。

冲突操作 结果集的当前行不能被其他事务更改,因为它将被更新锁锁定。提交后保持打开的结果集必须移动到下一行才能允许对其进行任何操作。

一些冲突可能会阻止结果集进行更新/删除: 如果当前行被同一事务中的语句删除,则调用ResultSet.updateRow() 将导致异常,因为游标不再位于有效行上。

【讨论】:

  • 那是“JavaDB”的文档,它是一个与 JDK 捆绑在一起的 DBMS。我不确定这是否适用于所有 DBMS?
【解决方案3】:

这个问题是由于用户错误造成的。我在另一台机器上运行了另一个应用程序副本,但我忘记了,它同时更改了数据库。

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 2023-02-10
    • 2013-02-13
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多