gpt4 book ai didi

java - 与事务相关的 View 中语句的可见性?

转载 作者:行者123 更新时间:2023-11-30 09:45:55 25 4
gpt4 key购买 nike

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

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

我的应用程序在使用 hibernate 模式的 JBoss 5 中运行。

View 是这样定义的:

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 和 View 中的 SELECT 实际上是同一个数据库事务的一部分(这必然意味着它们在相同的数据库 session ),新插入的行将在 View 中可见(假设该行满足 View 用来确定要显示哪些行的任何条件)。如果新用户不在 View 中,则意味着要么

  1. INSERTSELECT 不是同一数据库事务的一部分,或者
  2. INSERT 不足以使该行在 View 中可用。当您查询 View 时,可能还有一些其他的查询表加入了 View ,但该表没有新行的数据,但查询稍后会在事务中填充。
  3. 您的代码某处存在错误,您认为 INSERT 实际上并没有发生,或者在 INSERT 或查询实际上并未访问您发布的 View 。

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

关于java - 与事务相关的 View 中语句的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7389268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com