Java 与事务相关的视图中语句的可见性?

Java 与事务相关的视图中语句的可见性?,java,oracle,hibernate,transactions,Java,Oracle,Hibernate,Transactions,我对数据库视图中的数据可见性有一个问题。 我使用甲骨文。 我有一个表myscheme.users和一个表global.users myscheme和global是方案 全局方案中有一个视图globalusers,它合并了两个用户表 我有一个java应用程序,可以在myscheme.users表中插入一个新用户。之后,它在globalusers视图中查询新用户以加载新创建的用户。 因为所有这些都发生在同一个事务中。我现在的问题是,为什么新创建的用户在myscheme.user表中可见,而在glob

我对数据库视图中的数据可见性有一个问题。 我使用甲骨文。 我有一个表myscheme.users和一个表global.users myscheme和global是方案 全局方案中有一个视图globalusers,它合并了两个用户表

我有一个java应用程序,可以在myscheme.users表中插入一个新用户。之后,它在globalusers视图中查询新用户以加载新创建的用户。 因为所有这些都发生在同一个事务中。我现在的问题是,为什么新创建的用户在myscheme.user表中可见,而在globalusers视图中不可见? 当事务结束时,用户也在globaluser视图中

我的应用程序正在使用hibernate的JBoss5中运行

视图是这样定义的:

CREATE OR REPLACE VIEW V_USERACCOUNT AS
    SELECT u.USERACCOUNT_ID,u.USERNAME,u.INITIALS,u.COMMONNAME,u.PASSWORD,'local' AS source
        FROM "USERACCOUNT" u
    UNION
        SELECT u1.USERACCOUNT_ID,u1.USERNAME,u1.INITIALS,u1.COMMONNAME,u1.PASSWORD 'global' AS source
        FROM GLOBAL."USERACCOUNT" u1
如果表中的INSERT和视图中的SELECT实际上是同一数据库事务的一部分,这必然意味着它们是在同一数据库会话中执行的,那么新插入的行将在视图中可见,前提是该行满足视图用于确定要显示哪些行的任何条件。如果新用户不在视图中,这意味着

INSERT和SELECT不是同一数据库事务的一部分,或者 插入不足以使该行在视图中可用。在查询视图时,视图中加入的某些其他查找表可能没有新行的数据,但稍后会在事务中填充该查找表。 代码中的某个地方有一个bug,当您认为插入实际上没有发生时,或者在插入之后查询没有发生,或者查询没有实际命中您发布的视图。
根据您最近的更新,1似乎几乎肯定是问题所在。如果您有不同的数据源,INSERT使用一个数据源,SELECT使用第二个数据源,那么这两个操作不会发生在同一个数据库事务中。它们可能发生在同一个应用程序服务器事务中—应用程序服务器可能正在创建分布式事务—但如果它不是同一个数据库事务,您将无法看到未提交的更改。

添加statemets可能会很有用。创建表、创建表创建视图为、插入到、选择自、选择自。并解释你看到/发生了什么。你在useraccount中插入一个,然后在global.useraccount中创建一个副本,然后在v_useraccount上选择一个,你没有看到在global中添加的用户?不,我在global.useraccount中插入一个,然后在v_useraccount上选择一个,用户不在结果中正如justin所说,您可能在另一个会话中进行选择。好吧,随着代码的深入,它不是我的,我发现还有第二个entitymanager用于处理全局模式。。我对JBoss的了解还不够深入,但这可能是因为两个数据源之间没有事务吗?请参阅我对视图创建问题的修改。你完全正确,Justin+1,但是是否hibernate正在进行一些意外的缓存?@Miguel-缓存是可能的,尽管在我看来,当ORM本身被用于将更改持久化到数据库时,ORM不可能检测到更改。当其他应用程序更新数据时,缓存问题更为常见。但是,根据上次更新,使用了两个不同的数据源对象,我敢打赌问题在于使用了两个不同的数据库事务。我不知道Hibernate,但从实体框架的类比和web阅读来看,Hibernate的EnityManager是DB session的同义词,所以这应该是选项1。米格尔和其他人:你是对的。第二个entityManager导致了第二个事务。我创建了一个将两个操作分离的服务。现在它开始工作了。非常感谢!