SFSB中的容器管理事务边界

时间:2013-08-01 07:40:36

标签: java transactions ejb stateful-session-bean

我在书中读过:

  

通常,容器在企业bean方法启动之前立即开始事务。它在方法退出之前提交事务。

假设我的有状态EJB暴露了3种业务方法,客户端依次调用这3种方法,并希望在单个事务中运行这3种方法。这些方法将在多个请求中调用。

现在规范说该事务在方法退出之前提交。如果我的第一种方法成功且第二(或第三)方法失败,我将如何能够回滚整个事务?

请注意,我不想使用创建自己的事务边界。

任何帮助或正确方向的指针都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

在bean中创建一个调用所有其他3种方法的方法。然后他们将在同一笔交易中。

答案 1 :(得分:0)

您正在使用有状态会话bean充当缓冲区。并且您希望围绕多个呼叫进行交易。

从设计的角度来看,如果事务是从单个请求启动并提交/回滚的(例如,在单个HttpServletRequest内),则没关系。在这种情况下,您可以使用UserTransaction跨多次调用EJB来跨越事务。但是UserTransaction绑定到当前线程,因此可能很难将其传递给下一个请求。

如果您从不同的请求启动并提交,则无法控制事务的持续时间:现在客户端控制事务。如果该客户端崩溃,则在达到事务超时之前不会回滚事务。因此,在这种情况下的建议是缓冲在HttpSession中。如果已收集所有数据,请调用(无状态)EJB以保留它。