我正在阅读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消息并将电子邮件出列吗?
在这种情况下,如何回滚事务?
答案 0 :(得分:0)
因为JMS消息是从EJB内发送的,所以它是与EJB相同的事务上下文的一部分,无论JMS会话使用何种设置。
您声明,"如果所有个别交易都成功"。默认情况下,这些步骤中的每一步都是与MoneyTransfer相同的事务的一部分,因此任何异常(除了带有rollback = false的@ApplicationException)都会导致它们回滚。
电子邮件步骤在验证步骤之后,因此如果验证中发生异常,则不会发送邮件。