【问题标题】:EJB Transaction roll back in container managed transactions容器管理事务中的 EJB 事务回滚
【发布时间】:2014-11-26 22:59:27
【问题描述】:

我正在阅读 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: 如果 Notification 步骤失败,与 Confirmation 关联的 JMS 事务是否会回滚?换句话说,JMS 消息是否会出队,即 Notification 事件会从 JMS 队列中清除?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • “确认”JMS 排队事件会发生什么?你没有谈论它。我编辑了上面的问题以获得更具体的问题。谢谢
    • @brainstorm 你的伪代码有点混乱。确认是由 MoneyTransfer 发送的,还是由管理事务创建的临时目的地(回复)队列?
    • 这有什么关系?我不清楚你在问什么。确认只是整个 MoneyTransfer 交易中的另一个步骤。 MoneyTransfer 中的每一行都是整个交易的一个步骤
    • 在这种情况下是的,它会回滚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2020-10-25
    • 2017-03-29
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多