Transacation Propagation
如果方法抛出了一个系统异常或需要回滚的应用异常,则事务将会被自动回滚。
在容器对事务采取隐式管理的情况下,EJB服务器transaction manager会自动对事务进行管理。
它对事务进行协调,并将事务范围从一个EJB传播至下一个EJB,从而保证同一事务所涉及的所有
EJB都会被包含在事务的工作单元之内。这样transaction manager就可以监控每个enterprise
bean所作的更新,并根据这些更新的执行情况,决定是将所有由enterprise bean所做的更新全
部提交至数据库,还是将其全部回滚。
EJB服务器除了在其自己的环境中对事务进行管理外,还可以与其他的事务型系统协同工作。
事务和persistence context的传播
当我们在同一事务中调用多个使用entity manager的不同EJB时,有一些事务传播的规则是需要
考虑的。以下是详细的persistence context传播规则。
1.如果在事务范围之外调用transaction-scoped的entity manager,它就会创建一个与方法调用
时间等长的persistence context。当方法调用完成之后,任何由本次调用所产生的托管对象都
会随即变成游离对象。
2.如果在事务范围之内调用transaction-scoped的entity manager,并且也没有现成的
persistence context与事务关联,则容器将会创建一个新的persistence context。
3.如果在事务范围之内调用entity manager,且事务已经关联了某个persistence context,则
entity manager将会使用改persistence context。Persistence context会在同一事务中的不同
EJB调用之间进行传播。亦即,如果一个EJB在某一个事务中与注入的entity manager进行交互,
随后又在同一事务中调用了其他EJB,则改EJB调用将会使用同样的persistence context。(本人在项目中较多的使用了这种。)
4.如果使用transaction-scoped persistence context 的EJB调用了使用extended persistence
context的stateful session bean,则会导致错误发生。
5.如果使用extended persistence context的stateful session bean调用了另一个注入
transaction-scoped persistence context的EJB,则extended persistence context会被传播
。
6.如果一个EJB调用了具有不同事务范围的另一个EJB,则无论 persistence context是否是
extended的,它都不会被传播。
7.如果使用extended persistence context的stateful session bean 调用了另一个不是通过注
入方式获得的stateful session bean,且该session bean也具备extended persistence
context,则会导致错误发生。如果你将一个stateful session bean注入到另一stateful
session bean中,两个bean会共享同一个extended persistence context。不过,如果你是
手工创建的stateful session bean,则persistence context是不会被共享的。