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



我正在阅读这篇关于容器管理事务中的事务处理的博客。

作者清楚地划分了 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 上调用)都成功但Validation失败,那么来自确认步骤的 JMS 消息是否会回滚,电子邮件是否会被取消排队?
在这种情况下,事务的回滚是如何发生的?

因为 JMS 消息是从 EJB 内部发送的,所以它与 EJB 属于同一事务上下文的一部分,而不管 JMS 会话上使用的设置如何。

你说,"如果所有个人交易都成功"。默认情况下,这些步骤中的每一个都是与汇款相同的交易的一部分,因此任何异常(回滚=假@ApplicationException除外)都会导致它们回滚。

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

最新更新