我在书中读到:
通常,容器在企业 bean 方法开始之前立即开始事务。它在方法退出之前提交事务。
假设我的有状态 EJB 已经公开了 3 个业务方法,并且客户端顺序调用这 3 个方法并希望在单个事务中运行这 3 个方法。这些方法将在多个请求中调用。
现在规范说事务是在方法退出之前提交的。如果我的第一种方法成功而第二种(或第三种)方法失败,我将如何回滚整个事务?
请注意,我不想使用创建自己的事务边界。
任何帮助或正确方向的指针将不胜感激。
我在书中读到:
通常,容器在企业 bean 方法开始之前立即开始事务。它在方法退出之前提交事务。
假设我的有状态 EJB 已经公开了 3 个业务方法,并且客户端顺序调用这 3 个方法并希望在单个事务中运行这 3 个方法。这些方法将在多个请求中调用。
现在规范说事务是在方法退出之前提交的。如果我的第一种方法成功而第二种(或第三种)方法失败,我将如何回滚整个事务?
请注意,我不想使用创建自己的事务边界。
任何帮助或正确方向的指针将不胜感激。
在 bean 中创建一个调用所有其他 3 个方法的方法。然后他们将在同一个事务中。
您正在使用有状态会话 bean 作为缓冲区。你想要一个围绕多个调用的事务。
从设计的角度来看,如果事务是从单个请求(例如,从单个请求中)启动并提交/回滚的,则HttpServletRequest
可以。在这种情况下,您可以使用 aUserTransaction
跨越对 EJB 的多次调用的事务。但是 aUserTransaction
绑定到当前线程,因此可能很难将其传递给下一个请求。
如果您从不同的请求开始并提交,您将失去对事务持续时间的控制:现在客户端控制事务。如果该客户端崩溃,事务将不会回滚,直到达到事务超时。因此,在这种情况下,建议使用HttpSession
例如缓冲。如果已收集所有数据,则调用(无状态)EJB 以将其持久化。