【问题标题】:Stateless session bean transactions无状态会话 bean 事务
【发布时间】:2026-01-27 19:00:01
【问题描述】:

我正在开发一个 JSF Web 应用程序。服务层是使用无状态会话 bean 开发的。这些无状态 bean 使用 CDI 注入到托管 bean。

我知道要管理无状态 bean 中的事务,我可以使用容器管理的事务或 bean 管理的事务。此外,无状态 bean 中的所有公共方法默认情况下都在容器管理的事务中。

所以我的问题是:

无状态 bean 中的事务管理首选方法是容器管理还是 bean 管理?

是否建议在服务层同时使用 bean 管理和容器管理的事务 bean?

是否可以在单个 bean 中同时使用容器管理和 bean 管理的事务?如果可能,是否可取?

请告诉我您的建议...

【问题讨论】:

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


    【解决方案1】:

    无状态 bean 中的事务管理首选方法是容器>托管还是 bean 托管?

    典型和首选的方法是使用 CMT。事务管理是应用服务器提供的有用服务之一,它简化了您的开发,因此,您应该在绝大多数时间使用这种方法(这也是默认方法)。

    但是,在某些特殊情况下,BMT 仍然是必要的:

    a) 当您需要减少事务边界以提高性能时。

    b) 当您有一个有状态的会话 bean 并且您需要跨多个客户端调用保留一个事务时。 (很难看出什么时候会有用)。

    是否建议在服务层同时使用 bean 管理和容器管理的事务 bean?

    是的,如果某些服务需要上述特殊要求,您可以将这两种 bean 事务类型用作服务层的一部分。

    是否可以在单个 bean 中同时使用容器管理和 bean 管理的事务?如果可能,是否可取?

    不,这是不可能的。

    【讨论】:

      【解决方案2】:

      如果您的事务范围不跨越更多服务层方法,请使用容器管理事务:理想情况下,您应该为一种方法设置一个事务(容器触发的提交)。如果不是这种情况,bean 管理的事务应该更实用,让调用者决定何时提交或回滚。

      【讨论】: