【问题标题】:Visibilty of statements in a view related to transaction?在与交易相关的视图中声明的可见性?
【发布时间】:2023-03-25 14:52:01
【问题描述】:

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

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

我的应用程序正在使用休眠的 JBoss 5 中运行。

视图是这样定义的:

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

【问题讨论】:

  • 也许对添加 statemets 有用。创建表,创建表创建视图,插入,选择,选择。并解释你看到/发生的事情。
  • 您在 useraccount 中进行了插入,之后您在 global.useraccount 中创建了一个副本,然后在 v_useraccount 上进行了选择,您没有看到在 global 中添加了用户?
  • 不,我在 global.useraccount 中进行了插入,之后我在 v_useraccount 上进行了选择,并且用户不在结果中
  • 正如贾斯汀所说,您可能在另一个会话中进行了选择。
  • 好吧,随着代码的深入(这不是我的),我发现还有第二个实体管理器用于处理全局模式。我在 JBoss 中不够深入,但可以是不是两个数据源没有交易?

标签: java oracle hibernate transactions


【解决方案1】:

如果表中的INSERT 和视图中的SELECT 实际上是同一个数据库事务的一部分(这必然意味着它们在同一个数据库会话中执行),那么新插入的行将在视图中可见(假设该行满足视图用于确定要显示哪些行的任何标准)。如果新用户不在视图中,这意味着要么

  1. INSERTSELECT 不是同一个数据库事务的一部分,或者
  2. INSERT 不足以使该行在视图中可用。当您查询视图时,可能还有其他一些在视图中连接的查找表没有新行的数据,但该查找稍后会在事务中填充。
  3. 您的代码中的某处存在错误,当您认为它确实发生时,INSERT 实际上并没有发生,或者查询在 INSERT 之后没有发生,或者查询实际上没有到达您发布的视图.

根据您的最新更新,似乎#1 几乎肯定是问题所在。如果您有不同的数据源,INSERT 使用一个数据源,SELECT 使用第二个数据源,这两个操作不会发生在同一个数据库事务中。它们可能发生在同一个应用程序服务器事务中——应用程序服务器很可能正在创建一个分布式事务——但如果它不是同一个数据库事务,您将无法看到未提交的更改。

【讨论】:

  • 查看我对问题的修改以创建视图。
  • 贾斯汀 (+1) 你说的没错,但会不会是 hibernate 做了一些意想不到的缓存?
  • @Miguel - 缓存是可能的,尽管在我看来,当 ORM 本身用于将更改持久化到数据库时,ORM 不会检测到更改。当其他一些应用程序更新数据时,出现缓存问题更为常见。然而,根据上次更新使用了两个不同的 DataSource 对象,我敢打赌,问题在于使用了两个不同的数据库事务。
  • 不知道Hibernate,但是从与Entity Framework的类比和网上阅读来看,Hibernate的EnityManager是DB session的同义词,所以它应该是选项#1。
  • 米格尔和其他人:你是对的。第二个 entityManager 引发了第二个事务。我创建了一个将这两个操作分开的服务。现在它的工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2020-03-21
  • 2011-07-18
相关资源
最近更新 更多