我正在谈论EJB 3.1,我知道根据规范,无状态会话bean不能实现SessionSynchronization
接口,但有人可以向我解释原因吗?所以,我不是要求一个解决方法,但我想知道这个问题背后的原因。
我认为这与事务边界无关,因为容器应在业务方法完成时提交,如第13.6.2.2节所述:
容器尝试在业务时提交事务 方法已经完成。容器执行提交协议 在将方法结果发送到客户端之前。
通常,容器在a之前立即开始一个事务 enterprise bean方法刚刚启动并提交事务 方法退出。每种方法都可以与单个方法相关联 交易。 a中不允许嵌套或多个事务 方法
答案 0 :(得分:3)
问题与交易主题有关。由于无状态会话bean(SLSB)不在后续请求之间保持会话状态,因此资源状态的任何更改(例如,数据库更新)在方法的上下文中是本地的。跨SLSB的多个方法不能跨越事务。
关于有状态会话bean的情况(SFSB)有点不同。在方法结束之前完成事务不是必需的。因此,事务可以跨越多种方法。
当您让容器管理事务(CMT)并使用SFSB时,您可能无法准确知道事务何时开始/完成。您需要一种机制来通知何时发生这些操作。这是SessionSynchronization
接口实现的目的。
使用CMT的SLBS不会收到事务开始/结束通知,因为事务边界是已知的,并且它们仅限于业务方法执行。