Oracle 提交和选择之间存在滞后

2023-11-23

我们有一个 Java 工作流应用程序,它使用 Oracle 数据库来跟踪其步骤以及与其他服务的交互。在工作流运行期间,会执行多次插入/更新/选择,有时选择不会返回更新的数据,即使插入/更新提交在成功完成之前运行也是如此。工作流程出错后(由于数据错误),如果我们返回并通过第三方应用程序检查数据库,则会显示新的/更新的数据。我们的提交完成和可见之间似乎存在滞后。这种情况发生在所有工作流运行的大约 2% 中,并且在数据库使用量很大时会增加。

我们的数据库支持团队建议将参数 max-commit-propagation-delay 更改为 0,因为它默认为 700。这似乎是一个可能的解决方案,但最终并没有解决我们的问题。

该应用程序在WebSphere 上运行,并且Oracle 数据库配置为JDBC 数据源。我们使用的是 Oracle 10.1g。该应用程序是用 Java 1.5 编写的。

任何帮助,将不胜感激。

编辑:示例代码

DataSource ds; // spring configured

String sql = "INSERT INTO " + currentTable + " (" + stepId + ',' + stepEntryId + ", " + stepStepId + ", " + stepActionId + ", " + stepOwner + ", " + stepStartDate + ", " + stepDueDate + ", " + stepFinishDate + ", " + stepStatus + ", " + stepCaller + " ) VALUES (?, ?, ?, null, ?, ?, ?, null, ?, null)";

Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
// set values
stmt.executeUpdate();
// close connections

// later on in the code...
Connection conn = ds.getConnection();
PreparedStatement stmt = null;
ResultSet rset = null;

String sql = "SELECT " + stepId + ", " + stepStepId + ", " + stepActionId + ", " + stepOwner + ", " + stepStartDate + ", " + stepDueDate + ", " + stepFinishDate + ", " + stepStatus + ", " + stepCaller + " FROM " + currentTable + " WHERE " + stepEntryId + " = ?";
stmt = conn.prepareStatement(sql);

stmt.setLong(1, entryId);

rset = stmt.executeQuery();
//close connections

默认情况下,您描述的行为应该是不可能的 - 在已提交的事务中所做的更改立即可供所有会话使用。但是,也有例外:

  1. 您是否在 COMMIT 命令中使用了任何 WRITE 选项?如果不是,请确认 COMMIT_WRITE 初始化参数的值。如果其中任何一个使用“WRITE BATCH”或特别是“WRITE BATCH NOWAIT”,您可能会遇到并发问题。 “WRITE BATCH NOWAIT”通常用于写入事务的速度比可能的并发问题更重要的情况。如果您的初始化参数使用“WRITE”变体,您可以通过在提交中指定 IMMEDIATE 子句来在事务基础上覆盖它(参见提交)

  2. 尝试读取数据的事务是否在其他事务提交之前调用 SET TRANSACTION?使用 SET TRANSACTION 指定 SERIALIZATION LEVEL READ ONLY 或 SERIALIZABLE 将导致事务看不到调用 SET TRANSACTION 后发生的其他已提交会话中发生的任何更改(参见设置交易)

编辑:我看到您正在使用 DataSource 类。我不熟悉这个类 - 我认为它是一个连接共享资源。我意识到您当前的应用程序设计可能无法在整个工作流程中轻松使用相同的连接对象(这些步骤可能设计为独立操作,并且您没有构建一种设施来将连接对象从一个步骤传递到另一个步骤) next),但您应该验证返回到 DataSource 对象的连接对象是否“干净”,特别是对于打开的事务。您可能没有在代码中调用 SET TRANSACTION,但其他地方的 DataSource 的另一个使用者可能会这样做,并将连接返回到数据源,而会话仍处于 SERIALIZABLE 或 READ ONLY 模式。当连接共享时,必须先回滚所有连接,然后再将它们移交给新的使用者。

如果您无法控制或查看 DataSource 类的行为,您可能希望尝试在新获取的连接上执行 ROLLBACK,以确保它没有已建立的延迟事务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 提交和选择之间存在滞后 的相关文章

随机推荐

  • 在构造函数内分配原型

    我有这个代码 var MyClass function b this a b this getA function return that a var SecondClass function b this prototype new My
  • Multer 不接受数组格式的文件会出现“意外文件错误”

    Multer是与node js和express一起使用的用于上传文件的模块 我在角度方面使用 ng file upload 模块 当我一一发送多个文件时 它工作得很好 没有任何错误 但是当我以数组格式一次性发送所有文件 然后按照 Multe
  • Android ndk(cmake):在第二个 jni 库中使用日志 api 时,“未定义引用‘__android_log_write’”

    我使用 Android Studio 2 2 和 cmake 来构建 jni 文件 我想在 jni 文件中显示日志 但收到错误消息 未定义对 android log write 的引用 我的 CMakeLists txt 文件是 add l
  • CFG 的扩展,它是什么?

    考虑以下上下文无关语法的扩展 它允许规则在左侧有一个 或多个 终端在非终端的右侧 即 形式规则 A b gt 右侧可以是任何东西 就像在上下文无关语法中一样 特别是 它是not要求右侧末尾具有完全相同的终端符号 在这种情况下 此扩展将是上下
  • 大多数签名/未签名警告的可接受修复?

    我本人确信 在我正在研究的项目中 有符号整数在大多数情况下是最佳选择 即使其中包含的值永远不会是负数 更简单的反向 for 循环 更少的错误机会等 特别是对于只能保存 0 到 20 之间的值的整数 大多数出错的地方是 std vector
  • Android Play Places 出现 PLACES_API_INVALID_APP 错误

    我正在尝试 Google Place Autocomplete 示例https github com googlesamples android play places 我已将正确的 API 密钥放在正确的位置 我知道这一点是因为当我输入随
  • 关于:下载文件时浏览器中出现空白#被阻止

    我正在尝试从本地服务器下载文件 也许将来我需要在其他服务器上执行此操作 当我单击链接下载浏览器中的文件时 会出现此消息 about blank blocked 我正在使用 axios 和vue js 代码是这样的 downloadItem
  • Flex:如何检测用户是否阻止共享对象写入

    简单的问题是 如果用户已阻止将数据写入共享对象 我如何在动作脚本中检测 sharedObj SharedObject getLocal rememberme 这个返回总是共享对象 但它的大小是0 即使我已经阻止了共享对象 当我尝试将数据保存
  • 如何将多个python文件转换为EXE?

    我正在尝试将我的 python 应用程序转换为 exe 我见过像 py2exe 和 cx freeze 这样的东西 但它们只编译一个 py 文件 谁能帮我 谢谢 我目前使用py安装程序用于将项目构建为单个可执行文件 这些项目都包含多个Pyt
  • gacutil 构建后事件已退出,代码为 1

    我正在尝试在 GAC 中注册并组装构建后活动 这是我的构建后命令 C Program Files x86 Microsoft SDKs Windows v7 0A Bin NETFX 4 0 Tools x64 gacutil exe if
  • 如何在主目录中创建文件夹?

    我想创建一个目录path HOME somedir 我尝试过使用boost filesystem create directory path 但它失败了 显然该函数不会扩展系统变量 我怎样才能以最简单的方式做到这一点 注意 在我的例子中 字
  • 从单个项目源构建多个 jar

    我对 gradle 还很陌生 我想知道是否可以从同一项目源构建多个 jar 我浏览过以前的类似问题 但我的情况有点不同 我想将所有源文件编译两次以生成两个不同的 jar 每个 jar 具有不同的依赖项和不同的工件 id 从概念上讲 它可以表
  • MongoDB中每条记录的更新时间

    MongoDB 的 ObjectId 有一个 getTimestamp 方法 该方法返回插入记录的时间 是否有类似的方法来获取上次更新的时间 或者我应该使用单独的列来保存此数据 使用 PHP 如果重要的话 MongoDB 不存储最后的更新
  • 使用 jQuery 检查页面加载时的所有复选框

    在页面加载时 使用 jQuery 如何自动选择特定 div 中的所有复选框 function thediv input checkbox attr checked checked
  • 如何在war文件中运行java类文件[重复]

    这个问题在这里已经有答案了 我有一个名为 Sample war 的战争文件 在这个战争文件中 我有一个名为 Maintest 的主类 我想从战争之外运行或执行Maintest类 如何做到这一点 War 文件只是带有额外元数据的 Jar 文件
  • R:在函数内使用 dplyr。 eval(expr, envir, enclos) 中的异常:未知列

    我在 R 中创建了一个函数友善的帮助 Jim M 当我运行该函数时 我收到错误 错误 未知列 原始数据 当查看调试器时 我收到消息 Rcpp eval expr envir enclos 中的异常 未知列 rawdata 然而 当我查看环境
  • Swift 固体节拍器系统

    我正在尝试构建一个可靠的实体系统 以使用 SWIFT 在我的应用程序中构建节拍器 到目前为止 我已经使用 NSTimer 构建了一个看似可靠的系统 我现在遇到的唯一问题是 当计时器启动时 前两次点击是关闭时间 但随后它会陷入一个可靠的时间范
  • 我们一次最多可以通过蓝牙与 Android 设备配对多少个设备? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 谁能告诉我我们一次最多可以通过蓝牙与 Android 设备配对多少个设备 我用谷歌搜索了
  • Pandas read_sql_query 对某些列中的所有值返回 None

    我正在使用 pandas read sql query 将数据从 MySQL 数据库表读取到 pandas 数据帧中 该表中的某些列具有全部 NULL 值 对于这些列 pandas 数据框的每一行都不包含任何内容 对于所有其他列 数据帧包含
  • Oracle 提交和选择之间存在滞后

    我们有一个 Java 工作流应用程序 它使用 Oracle 数据库来跟踪其步骤以及与其他服务的交互 在工作流运行期间 会执行多次插入 更新 选择 有时选择不会返回更新的数据 即使插入 更新提交在成功完成之前运行也是如此 工作流程出错后 由于