最近重构了一些代码,遇到了一个事务回滚场景,其中一个EJB bean调用另一个。现在在异常块中,每个bean都有其上下文,标记为回滚。
这是一个很好的做法,还是应该重新抛出异常&最后,启动器bean只进行回滚。
此外,如果跨EJB的单个事务跨越,则回滚应该在originator bean或遇到异常的地方发生。
使用XA数据源进行持久化的事务类型JTA。
答案 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的漏洞,而不会被捕获。因此,您最终会遇到一个不需要回滚的事务。