问题标签 [bean-managed-transactions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
299 浏览

java - EJB3:为什么要考虑事务语义和状态性的实现细节?

事务语义和状态完整性在 EJB3 中被视为实现细节。实现可以决定是使用 bean 还是容器管理的事务。它可以决定容器管理事务的类型。它可以决定它是有状态的还是无状态的。

但是,从逻辑上讲,这些都是重要的接口细节。示例: (a) 使用 bean 管理事务的 bean 不能调用使用容器管理事务的 bean。(b) 无状态 bean 不能调用有状态的 bean。

当呈现一个 EJB3 接口时,您不知道它需要什么样的事务语义。同样,您不知道它是有状态的还是无状态的。您需要额外的实施细节。示例:文档。

在运行时,可以动态实例化不同的 bean 和调用链。因此可能会出现无效状态。现在 - 容器可以捕获这些情况;但为什么要等到运行时?

为什么事务语义和状态完整性要求不是接口的一部分?

0 投票
1 回答
2132 浏览

java - Seam 管理的事务操作方法

Seam 建议在有状态会话 Bean 中使用扩展的持久性上下文,以便拥有 Seam 管理的持久性。

我不清楚上述建议是否会对我们希望拥有 Seam 管理的交易的方式产生任何影响。这是因为我们的架构不同。我们在无状态EJB中有以下持久性上下文:

我们的 DAO 调用上述 CrudServiceBean 是带有 @TransactionAttribute(TransactionAttributeType.REQUIRED) 的无状态 EJB(其中一些也是 Seam 组件)。因此,我们的事务由容器(WebLogic)而不是 Seam 处理。

但是,我们现在需要满足以下场景:我们需要一个前端 Seam 组件(非 EJB)调用多个 DAO (EJB) 方法并将所有这些方法包装在一个事务中。如果我理解正确,我们需要有 Seam 管理的事务。

我们可以像我描述的场景那样拥有 Seam 管理的事务,而没有 Seam 管理的持久性上下文吗?还是两者无关?

0 投票
3 回答
12900 浏览

java - UserTransaction 如何传播?

我有一个带有 bean 管理事务的无状态 bean,以及这样的方法:

那么如何UserTransaction传播到OtherStatelessBeanLocalbean?

0 投票
1 回答
1273 浏览

rest - 在 JPA/JTA 事务中调用 HTTP 服务 - 事务完整性

我有一个使用容器管理持久性的 JSF/EJB/JPA 应用程序。在一种情况下,通过 HTTP 对外部服务进行调用是有成本的,该成本被分配回请求用户。在当前实现中,发出 HTTP 请求的过程由在后台定期运行的 EJB 计时器方法执行。

计时器方法可能必须在一次调用中处理多个请求,尽管每个请求都需要独立处理,独立于将成本分配给用户,也就是说。如果用户 A 没有足够的信用来购买一本书,这不能阻止用户 B 成功购买一本书,导致他们的余额由于回滚而被借记。

为了为每个请求的独立处理提供对事务分界的控制,我将 bean 管理的事务用于计时器方法所在的类。这是我现在所拥有的 java 伪代码版本:

所以我的想法是我开始一个事务,假设成功并从用户那里扣除成本,调用 http 服务并在它成功时提交,否则回滚。

我有一种不安的感觉,即我可能无法使用这种设计,特别是在 pessimistic_write 事务中有冗长的 http 调用(实际上是使用 jax-rs 完成的)。我想知道我是否可以首先在交易中借记用户(开始/借记/提交),进行 http 调用,然后在发生任何错误时记入用户,但没有交易完整性。

这对我来说是新的领域,谁能指出我正确的方向,有没有一种既定的方式来做我想做的事情?

非常感谢。

ps 我正在使用带有 Seam 3 的 glassfish 3.1 堆栈

0 投票
1 回答
972 浏览

transactions - EJB 中的一些 CMT 和 BMT 疑虑?

在会话 bean 中使用 CMT 时,我们在哪里提交事务?

使用 REQUIRES_NEW 属性容器创建一个新事务,调用者事务被挂起只要更好地理解 REQUIRES_NEW ,它是否通过将事务与新连接关联来实现上述行为。一旦完成当前事务,它会假设以前的连接?当新事务发生提交时?

有人可以指出我使用 JDBC 的会话 bean 的简要 eamxple CMT 和 BMT。基本上看我们如何在 CMT 和 BMT 中获得连接、提交、回滚

在 CMT 中,事务管理器完成与当前线程关联的事务。我的问题是它如何提交事务。我知道使用连接提交事务,但在这里如何知道与当前线程关联的连接,如在一个示例中,我看到使用 new 运算符在方法内创建连接。

0 投票
2 回答
208 浏览

java - Java中事务API的需求

首先我的问题是 java 中的 Transaction API 需要什么?给我一个实际的例子?

Container Managed Transaction 和 Bean Managed Transaction 是什么意思?

声明式事务和程序化事务之间的区别?

请帮我

提前致谢

0 投票
2 回答
3212 浏览

jpa - Glassfish:JTA/JPA 事务不回滚

我正在使用 Oracle 数据库运行 Glassfish 3.1.1,并且遇到了事务不回滚的问题,但到目前为止仅在一个特定环境中。相同的应用程序在其他机器上按预期工作。但是,同一台机器上的两个单独的 Glassfish 域会受到影响。

在受影响的环境中,我在 EJB 中的容器管理事务 (CMT) 和抛出 RuntimeException 的容器管理事务 (CMT) 和UserTransaction#rollback().

在这两种情况下,根本问题似乎是 JDBC 连接仍然以某种方式设置为 autoCommit = true 即使有一个 JTA 事务正在进行。

我的 EJB/CMT 测试如下所示:

我的 BMT/UserTransaction 测试是这样的:

当我调用任一方法时INSERT INTO FOO,即使事务已回滚,也会提交。

我错过了什么 - 也许我的连接池/数据源设置不正确?

我使用 OracleConnectionPoolDataSource 作为数据源类名。我需要做些什么来确保我的数据库连接参与 JTA 事务吗?

更新 1我最初认为这是一个问题,OracleConnectionPoolDataSource但事实证明它不相关。完全相同的池配置适用于一种环境,但不适用于另一种环境。

更新 2澄清这不是 EJB/CMT 问题,而是一般 JTA 问题。

UPDATE 3添加了有关 JDBC 自动提交的信息。确认persistence.xml 是正确的。

0 投票
0 回答
335 浏览

ejb-3.0 - 在 EJB 3.x 中使用资源管理器特定的事务划分 API

根据 EJB 3.0 规范:当实例处于事务中时,该实例不得尝试使用资源管理器特定的事务划分 API(例如,它不得调用 java.sql.Connection 接口或javax.jms.Session 接口)在规范的 13.3.3 中。我尝试了一个示例 - 在 BEAN 托管事务中我包含 java.sql.Connection.commit() - 在 NetBeans 中创建无状态 bean 作为 EE5,部署在 Glassfish 3.1 上并且容器没有抱怨?Bean 方法更新数据库,在 Glassfish 日志中没有任何错误。这是预期的行为吗?

此外,对于具有规范中提到的容器事务管理事务的 bean,使用 java.sql.Connection.commit() 没有这样的限制。谢谢布拉尼斯拉夫

0 投票
1 回答
1120 浏览

java - Java、JPA、bean 托管事务、TransactionRequiredException

我有两个无状态 EJB。一种使用容器管理事务,另一种使用 bean 管理。从容器管理的 EJB 中,我调用了一种 bean 管理的 EJB 方法。

我得到了错误

我可以使用容器管理的 EJB 中的 bean 管理的事务调用 EJB 的方法吗?如果是 - 有什么问题?

PS 我在第 34 行遇到了错误。这是这一行的代码:

0 投票
1 回答
594 浏览

jakarta-ee - Bean 管理的事务:事务传播

我是 EJB 的新手。我读过 bean 管理事务 (BMT) 的副作用之一是,如果我们调用另一个 BMT bean 的方法,则事务不会传播。但是由于第三个 ACID 属性(隔离),这是否意味着第二个方法(内部)不会看到在第一个方法(外部)中所做的更改?