Jakarta ee 容器管理事务中的EJB事务回滚

Jakarta ee 容器管理事务中的EJB事务回滚,jakarta-ee,transactions,ejb-3.1,stateless-session-bean,Jakarta Ee,Transactions,Ejb 3.1,Stateless Session Bean,我正在阅读容器管理事务中的事务处理 作者清楚地划分了EJB事务和数据库事务之间的区别。 数据库事务只是EJB事务之一 考虑这个例子: 以金钱交易为例。这不仅改变了一个或多个数据库中的一些数字。还有管理、通知、确认和验证 基于此示例考虑以下无状态bean, @Stateless public class MoneyTransactionBean { public void MoneyTransfer(int amount, BankAccount from, BankAccount to){

我正在阅读容器管理事务中的事务处理

作者清楚地划分了EJB事务和数据库事务之间的区别。 数据库事务只是EJB事务之一

考虑这个例子:

以金钱交易为例。这不仅改变了一个或多个数据库中的一些数字。还有管理、通知、确认和验证

基于此示例考虑以下无状态bean,

@Stateless
public class MoneyTransactionBean {

public void MoneyTransfer(int amount, BankAccount from, BankAccount to){

//db transaction
 /  // adminstration transaction //JMS
    // confirmation //JMS
    // Notification //JSP
    // validation //EJB
    // email //JMAIL
 }

}
情景1: 如果通知步骤失败,与确认关联的JMS事务是否回滚?换句话说,JMS消息是否会退出队列,即从JMS队列中清除通知事件

情景2: 如果在各个bean上调用的所有单个事务都成功,但验证失败,那么来自确认步骤的JMS消息是否会回滚,电子邮件是否会退出队列?
在这种情况下,事务回滚是如何发生的?

因为JMS消息是从EJB内部发送的,所以它与EJB属于相同的事务上下文,而与JMS会话上使用的设置无关

您可以声明,如果所有单个事务都成功。默认情况下,这些步骤中的每一步都是与MoneyTransfer相同的事务的所有部分,因此,除了回滚为false的@ApplicationException之外的任何异常都将导致它们回滚


电子邮件步骤在验证步骤之后,因此如果验证过程中发生异常,则不会发送任何邮件

确认JMS排队事件会发生什么情况?你没有谈论它。我对上面的问题进行了编辑,以获得更具体的问题。Thanks@brainstorm您的伪代码有点混乱。确认是通过转账发送的,还是由管理事务创建的对队列的临时目的地回复?这有什么关系?我不清楚你在问什么。确认只是整个转账交易的另一个步骤。汇款中的每一行都是整个交易的一个步骤,在这种情况下,是的,是它的回滚。