java - 跨多个 EJB 的事务

标签 java transactions ejb ejb-3.0

最近重构一些代码,遇到一个 EJB bean 调用另一个 EJB bean 的事务回滚场景。现在,在异常 block 中,每个 bean 都有其标记为回滚的上下文。

这是一个好的实践吗?还是他们应该重新抛出异常,最后启动器 bean 只执行回滚。

此外,如果存在跨 EJB 的单个事务,则应在发起者 bean 或遇到异常的位置进行回滚。

用于持久化 XA 数据源的事务类型 JTA。

最佳答案

有了这个

is marked for rollback

您的意思是 EJB 捕获异常并使用 setRollbackOnly

如果是这种情况,那么取决于您的设计来决定首选哪种方法。

通常,如果容器检测到系统异常,事务就会回滚。相反的应用程序异常则没有这种效果。

但是,如果您的业务逻辑要求即使是业务异常也会产生重要影响,以至于必须具有回滚整个事务的效果,那么您可以选择 setRollBackOnly,或者 launch rollback=true 的应用程序异常。

第二种方法也具有不破坏 bean 的效果。

关于你的第二个问题:

Also, if there is single transaction spanned across EJB's, then rollback should happen at the originator bean or where it encountered exception.

回滚由容器管理,这又取决于您的设计。请记住,错误可能会通过负责回滚事务的唯一 bean 的孔传递,而根本不会被捕获。因此,您最终会遇到一个不需要的情况,即事务根本不会回滚。

关于java - 跨多个 EJB 的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40257829/

相关文章:

java - Persistence.xml 配置不正确

java - EJB 的访问控制列表 (ACL)

java - 我们应该始终在 JBoss 应用程序的客户端关闭 javax.naming.InitialContext 吗?

java - 无法在 Redis 中保存 java 对象

java - 如何将猜测的字母添加到空字符数组中,确保它们永远不会被覆盖?

java - 在java中转换对象时如何摆脱@SuppressWarnings ("unchecked")

php - 检查事务的状态 - MySQL 和 PHP

Java编程-帮助初始化(地毯)

ruby-on-rails - 使用 RSpec 测试 Redis 事务

spring - 暂停交易是什么意思?