我无法在线找到这个问题的解决方案,所以我希望我能在这里找到帮助。
我继承了一个Java Web应用程序,该应用程序对Oracle数据库执行更改并显示数据。该应用程序使用' pamsdb'用户身份。应用程序在其中一个表中插入了一个新行(TTECHNOLOGY)。当应用程序稍后查询数据库时,结果集包括新行(我可以在打印输出和应用程序屏幕中看到它)。 但是,当我使用sqldeveloper直接查询数据库时(使用相同的用户ID ' pamsdb'),我在修改后的表中看不到新行。
几点说明:
1)我读了here,在其他位置,所有INSERT操作都应该跟一个COMMIT,否则其他用户看不到这些变化。 Java应用程序不执行COMMIT,我认为这可能是问题的根源,但由于我在sqldeveloper中使用相同的用户ID,我很惊讶我可以&# 39;看看那里的变化。
2)我尝试从sqldeveloper做COMMIT WORK,但它并没有改变我的情况。
任何人都可以提出导致这种差异的原因以及如何解决这个问题?
提前致谢!
答案 0 :(得分:5)
您使用的是同一个用户,但在不同的会话中。一旦会话无法在另一个会话中看到未提交的更改,对于任何用户 - 它们都是独立的。
您必须从执行插入的会话中提交 - 即您的Java代码必须提交其更改才能在其他任何位置可见。您不能从其他地方进行Java会话的更改提交,并且从SQL Developer提交 - 即使是同一个用户 - 只提交 会话中所做的任何更改。
您可以阅读更多about connections and sessions和transactions,commit文档摘要为:
使用COMMIT语句结束当前事务并在事务中执行永久性所有更改。事务是Oracle数据库视为单个单元的一系列SQL语句。此语句还会擦除事务中的所有保存点并释放事务锁。
在您提交交易之前:
- 您可以通过查询已修改的表来查看在事务期间所做的任何更改,但其他用户无法查看更改。提交事务后,更改对提交后执行的其他用户的语句可见。
- 您可以使用ROLLBACK语句回滚(撤消)在事务期间所做的任何更改(请参阅ROLLBACK)。
“其他用户看不到更改”实际上意味着其他用户会话。
如果 的更改已提交,并且通过Java代码从新会话中可见(在重新启动Web应用程序和/或其连接池之后),但仍然无法从SQL中看到开发者;或直接在SQL Developer中进行的更改(并在那里提交)对Java会话不可见 - 然后更改将在不同的数据库中进行,或者在同一数据库的不同模式中进行,或者(不太可能)被VPD隐藏。从两个会话使用的连接设置中可以看出这一点。
从评论看来,这似乎是问题所在,Java Web应用程序和SQL Developer访问不同的模式,两者都有相同的表。