【问题标题】:Is the executeBatch() performed on Oracle is done in order?Oracle上执行的executeBatch()是否按顺序完成?
【发布时间】:2014-11-20 05:59:14
【问题描述】:

这更像是一种理论问题,用于了解 Oracle 如何处理 executeBatch() 请求。

考虑有三个插入语句(PreparedStatement),比如语句 1、语句 2 和语句 3 被添加为使用 executeBatch() 方法和 Oracle 上的批处理执行。语句 2 的执行是否有可能在语句 1 完成之前完成?也就是说,statement 2 的 insert 操作能在 operation 执行的 insert 之前成功吗?

如果自动提交设置为 false。

提前致谢。

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    数据库将按照您放入批处理的顺序执行您的语句。

    没有乱序或并发执行。

    【讨论】:

    • 谢谢,如果我碰巧在插入时查询表(插入记录的位置),是否有机会获得语句 2 插入的记录而不是记录由语句 1 插入,但片刻后相同的查询返回两条记录?基本上我试图在上面的问题上建立一个测试用例。
    • 支持上述答案的证明(一种验证执行顺序的方法)参见:community.oracle.com/thread/1326781?start=0&tstart=0
    • 并非如此。语句的顺序与它们在批处理中的顺序相同(链接的线程通过引用 API 文档来断言)。但是表中行的物理布局是无法控制的,没有ORDER BY的SELECT中行的检索顺序也是不明确的。
    • "在插入发生时查询表"。这只能通过另一个连接发生。该连接不会看到任何未提交的更改。当您提交时,您在事务中所做的更改将以原子方式(全部或全部)变得可见。
    • @Vishnu 我有,我得到的不是你得到的。我得到的是:“如果您需要对 记录 进行排序,则需要显式维护它(通过额外的列等),而不是依赖于您无法控制的插入顺序/行 ID。 " 这也意味着,您不应该关心任何订购的 插入顺序,因为这应该超出用户的想象。您无法根据该讨论验证实际的插入顺序(尽管使用序列已经足够接近)
    【解决方案2】:

    提供的自动提交设置为 false

    如果您担心在插入过程中查询(正如您在对另一个答案的评论中提到的那样),那么答案是直截了当的:

    鉴于在同一连接中,您不能在之前的插入语句完成之前进行查询,这意味着您的查询需要来自另一个连接。

    在 Oracle 中,在提交任何插入/更新/删除之前,更改对其他连接不可见。这意味着,查询将在任何插入完成之前看到快照,直到您提交更改。

    那么你应该不用担心这方面的插入顺序。

    【讨论】:

    • 谢谢,如果自动提交设置为true,那么插入顺序是否重要?
    【解决方案3】:

    处理批处理时,操作按批处理的顺序执行。

    Oracle Database JDBC Developer's Guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多