我正在阅读这篇关于容器管理事务中的事务处理的博客。
作者清楚地划分了 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除外)都会导致它们回滚。
电子邮件步骤在验证步骤之后出现,因此如果在验证中发生异常,则不会发送任何邮件。