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

时间:2014-11-26 22:59:28

标签: java-ee transactions ejb-3.1 stateless-session-bean

我正在阅读this blog关于容器管理事务中的事务处理。

作者清楚地划分了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队列中清除Notification事件?

场景2:  如果所有单个事务(在相应的bean上调用)都成功但Validation失败,那么将回滚确认步骤中的JMS消息并将电子邮件出列吗? 在这种情况下,如何回滚事务?

1 个答案:

答案 0 :(得分:0)

因为JMS消息是从EJB内发送的,所以它是与EJB相同的事务上下文的一部分,无论JMS会话使用何种设置。

您声明,"如果所有个别交易都成功"。默认情况下,这些步骤中的每一步都是与MoneyTransfer相同的事务的一部分,因此任何异常(除了带有rollback = false的@ApplicationException)都会导致它们回滚。

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