sql - 插入的数据未使用直接查询显示在 Oracle 数据库中

标签 sql oracle

我无法在网上找到这个问题的解决方案,所以我希望我能在这里找到帮助。

我继承了一个 Java Web 应用程序,该应用程序对 Oracle 数据库执行更改并从中显示数据。该应用程序使用“pamsdb”用户 ID。应用程序在其中一个表 (TTECHNOLOGY) 中插入了一个新行。当应用程序稍后查询数据库时,结果集包括新行(我可以在打印输出和应用程序屏幕中看到它)。
但是,当我直接使用 sqldeveloper(使用 相同用户 ID 'pamsdb')查询数据库时,我在修改后的表中看不到新行。

一些注意事项:

1) 我读了 here而在其他位置,所有 INSERT 操作都应该跟在 COMMIT 之后,否则其他用户无法看到更改。 Java 应用程序做 不是 做 COMMIT,我认为这可能是问题的根源,但由于我在 sqldeveloper 中使用相同的用户 ID,我很惊讶我看不到那里的更改。

2)我尝试从 sqldeveloper 执行 COMMIT WORK,但它并没有改变我的情况。

任何人都可以建议导致差异的原因以及如何解决?

提前致谢!

最佳答案

您使用的是同一个用户,但在不同的 session 中。一旦 session 无法看到在另一个 session 中所做的未提交更改,对于任何用户 - 它们是独立的。

您必须从执行插入的 session 中提交 - 即您的 Java 代码必须提交其更改才能在其他任何地方可见。您不能从其他地方提交 Java session 的更改,并且从 SQL Developer 提交 - 即使是同一用户 - 也只会提交在该 session 中所做的任何更改。

您可以阅读更多 about connections and sessions , 和 transactions ,以及 commit文档总结如下:

Use the COMMIT statement to end your current transaction and make permanent all changes performed in the transaction. A transaction is a sequence of SQL statements that Oracle Database treats as a single unit. This statement also erases all savepoints in the transaction and releases transaction locks.

Until you commit a transaction:

  • You can see any changes you have made during the transaction by querying the modified tables, but other users cannot see the changes. After you commit the transaction, the changes are visible to other users' statements that execute after the commit.
  • You can roll back (undo) any changes made during the transaction with the ROLLBACK statement (see ROLLBACK).


“其他用户无法看到更改”实际上意味着其他用户 session 。

如果正在提交更改并且可以通过 Java 代码从新 session 中看到更改(在 Web 应用程序和/或其连接池重新启动之后),但在 SQL Developer 中仍然不可见;或者直接在 SQL Developer 中进行的更改(并在那里提交)对 Java session 不可见 - 那么这些更改要么在不同的数据库中进行,要么在同一数据库的不同模式中进行,或者(不太可能)被 VPD 隐藏.从两个 session 使用的连接设置中可以看出这一点。

从评论来看,这似乎是这里的问题,Java Web 应用程序和 SQL Developer 访问具有相同表的不同模式。

关于sql - 插入的数据未使用直接查询显示在 Oracle 数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36068520/

相关文章:

mysql - 从查询中获取所有数据 select in select union mysql

sql - UPDATE table_name SET col_name = varchar WHERE col_name is NULL;

MYSQL:BULK select 仍然可以从相同值的输入返回结果数组吗?

sql - 防止更新不存在的行

sql - 如何从一个表和一个子表中进行选择

mysql - 如何订购此 UNION MySQL 查询?

sql - 设置日期 SQL Oracle

oracle - 如何在 Oracle SQL Developer 中防止 "parameter PLSQL_DEBUG is deprecated"编译器警告

c# - 没有主键的 NHibernate 字典映射

sql - 数据仓库中物化 View 的刷新策略