跨多个EJB的事务

时间:2016-10-26 08:54:42

标签: java transactions ejb ejb-3.0

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

这是一个很好的做法,还是应该重新抛出异常&最后,启动器bean只进行回滚。

此外,如果跨EJB的单个事务跨越,则回滚应该在originator bean或遇到异常的地方发生。

使用XA数据源进行持久化的事务类型JTA。

1 个答案:

答案 0 :(得分:1)

有了这个

  

标记为回滚

你的意思是EJB捕获异常并使用... config.set({ ... reporters: ["spec"], specReporter: { maxLogLines: 5, // limit number of lines logged per test suppressErrorSummary: true, // do not print error summary suppressFailed: false, // do not print information about failed tests suppressPassed: false, // do not print information about passed tests suppressSkipped: true, // do not print information about skipped tests showSpecTiming: false // print the time elapsed for each spec }, plugins: ["karma-spec-reporter"], ...

如果是这种情况,则取决于您的设计,决定采用哪种方法。

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

但是,如果您的业务逻辑要求即使业务异常具有重要影响,使其必须具有回滚整个事务的效果,那么您可以选择setRollbackOnly,或启动应用程序异常与setRollBackOnly

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

关于你的第二个问题:

  

此外,如果跨EJB的单个事务跨越,那么   回滚应该在originator bean或遇到的地方发生   异常。

回滚由容器管理,同样取决于您的设计。请记住,错误可能会通过您负责回滚事务的唯一bean的漏洞,而不会被捕获。因此,您最终会遇到一个不需要回滚的事务。