跨多个 EJB 的事务
Transaction across multiple EJBs
最近重构一些代码,遇到一个EJB bean调用另一个的事务回滚场景。现在在异常块中,每个 bean 都有其标记为回滚的上下文。
这是一个好的做法,还是他们应该重新抛出异常,最后启动器 bean 只执行回滚。
此外,如果单个事务跨越 EJB,则回滚应该发生在发起者 bean 或它遇到异常的地方。
使用 XA 数据源持久化的事务类型 JTA。
有了这个
is marked for rollback
你的意思是 EJB 捕获异常并使用 setRollbackOnly
?
如果是这种情况,则取决于您的设计来决定首选哪种方法。
通常情况下,如果容器检测到系统异常,则会回滚事务。相反的应用程序异常没有这个效果。
但是,如果您的业务逻辑要求即使是业务异常也有重要影响,以至于它必须具有回滚整个事务的效果,那么您可以选择setRollBackOnly
,或者启动一个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 的漏洞,而根本不会被捕获。所以你最终会遇到一个不想要的场景,事务根本没有被回滚。
最近重构一些代码,遇到一个EJB bean调用另一个的事务回滚场景。现在在异常块中,每个 bean 都有其标记为回滚的上下文。
这是一个好的做法,还是他们应该重新抛出异常,最后启动器 bean 只执行回滚。
此外,如果单个事务跨越 EJB,则回滚应该发生在发起者 bean 或它遇到异常的地方。
使用 XA 数据源持久化的事务类型 JTA。
有了这个
is marked for rollback
你的意思是 EJB 捕获异常并使用 setRollbackOnly
?
如果是这种情况,则取决于您的设计来决定首选哪种方法。
通常情况下,如果容器检测到系统异常,则会回滚事务。相反的应用程序异常没有这个效果。
但是,如果您的业务逻辑要求即使是业务异常也有重要影响,以至于它必须具有回滚整个事务的效果,那么您可以选择setRollBackOnly
,或者启动一个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 的漏洞,而根本不会被捕获。所以你最终会遇到一个不想要的场景,事务根本没有被回滚。