Jakarta ee 是否可以在远程EJB中使用TransactionManagementType.CONTAINER?

Jakarta ee 是否可以在远程EJB中使用TransactionManagementType.CONTAINER?,jakarta-ee,transactions,glassfish,ejb,corba,Jakarta Ee,Transactions,Glassfish,Ejb,Corba,是否可以在远程EJB实现中使用TransactionManagementType.CONTAINER而不是TransactionManagementType.BEAN 为了进一步澄清,我不想在我的业务层中处理begin和roolback方法,但我没有找到另一种方法来实现它 我正在使用Glassfish 5和corbaname:iiop协议来访问我的远程EJB 用法示例: 此代码块在我的服务器上运行: package br.com; @Remote interface IRemote {void

是否可以在远程EJB实现中使用
TransactionManagementType.CONTAINER
而不是
TransactionManagementType.BEAN

为了进一步澄清,我不想在我的业务层中处理
begin
roolback
方法,但我没有找到另一种方法来实现它

我正在使用Glassfish 5和
corbaname:iiop
协议来访问我的远程EJB

用法示例:

此代码块在我的服务器上运行:

package br.com;
@Remote
interface IRemote {void method();}

@Stateless
@TransactionManagement(value = TransactionManagementType.BEAN)
class Remote implements IRemote { 
@Resource
private UserTransaction ut;

void method(){
    try{
        ut.begin();
        <my business logic>
        ut.commit();
    }
    catch(Exception e){...}
}
我下面是Oracle的文章,但它使用了
TransactionManagementType.BEAN
,没有任何解释


在不需要上述事务的情况下,还有其他方法可以做到这一点吗?

看看容器管理的事务

如果客户端在事务中运行,则为RequiresNew属性 并调用企业bean的方法,容器接受 以下步骤:

暂停客户的交易

启动新事务

将调用委托给方法

在方法完成后恢复客户端的事务

如果客户机未与事务关联,则容器 在运行方法之前启动新事务

如果要确保 该方法始终在新事务中运行


查看容器管理的事务

如果客户端在事务中运行,则为RequiresNew属性 并调用企业bean的方法,容器接受 以下步骤:

暂停客户的交易

启动新事务

将调用委托给方法

在方法完成后恢复客户端的事务

如果客户机未与事务关联,则容器 在运行方法之前启动新事务

如果要确保 该方法始终在新事务中运行

默认情况下(根据EJB规范),会话bean使用ContainerManagedTransaction,如果没有注释,则为必需。 这应该在远程或本地工作

你也可以直接做

@TransactionManagement(value = TransactionManagementType.CONTAINER)
@Required
public class MyBean ... {
   @Supported  // override class level annotaion
   public void method(...) {
   }
}
从上面的错误消息中,我假设您尝试使用TMType.BEAN,但在方法中添加了@Required左右,这被容器抑制,因为不允许组合

默认情况下(根据EJB规范),会话bean使用ContainerManagedTransaction,如果没有注释,则为必需。 这应该在远程或本地工作

你也可以直接做

@TransactionManagement(value = TransactionManagementType.CONTAINER)
@Required
public class MyBean ... {
   @Supported  // override class level annotaion
   public void method(...) {
   }
}

从上面的错误消息中,我假设您尝试使用TMType.BEAN,但在方法中添加了@Required左右,这被容器抑制,因为不允许组合

您需要从远程bean中完全删除
@TransactionManagement
-注释,然后默认为CMT。使用
UserTransaction
将是非法的。所以你也必须把它去掉,但这就是重点,不是吗


但是请注意:您可能会创建远程事务,这意味着两个容器可能会使用XA协议进行同步。如果您不希望这样做,请将
TransactionAttribute
定义为
TransactionAttributeType.REQUIRES\u NEW
,这样您将具有与以前相同的行为,而不明确说明用户事务

您需要从远程bean中完全删除
@TransactionManagement
-注释,然后默认为CMT。使用
UserTransaction
将是非法的。所以你也必须把它去掉,但这就是重点,不是吗


但是请注意:您可能会创建远程事务,这意味着两个容器可能会使用XA协议进行同步。如果您不希望这样做,请将
TransactionAttribute
定义为
TransactionAttributeType.REQUIRES\u NEW
,这样您将具有与以前相同的行为,而不明确说明用户事务

当我使用@TransactionAttribute时,我在部署时遇到错误“在事务类型为[bean]的bean上可能未指定方法级事务属性。有关详细信息,请参阅server.log。”当我不使用@TransactionAttribute时,我在运行时遇到异常“TransactionRequiredException”当我执行持久化操作时,事务属性只能在CMTs中使用:请参阅“TransactionAttribute注释…只能在使用容器管理的事务划分时指定”。当我使用@TransactionAttribute时,我在部署时遇到错误“不能在事务类型为[bean]的bean上指定方法级事务属性。有关更多详细信息,请参阅server.log。“当我不使用@TransactionAttribute时,我在运行时遇到异常“TransactionRequiredException”,当我执行持久化操作时,“transaction属性只能在CMTs中使用”:请参阅“TransactionAttribute注释…只能在使用容器管理的事务划分时指定。“当我删除@TransactionManagement时,我在客户机中遇到一个异常:javax.ejb.EJBException:java.lang.SecurityException。。。原因:com.sun.jts.jta.TransactionManagerImpl.rollback(TransactionManagerImpl.java:376)上的java.lang.SecurityException我不认为SecurityException与CMT有关,可能是:捕获它,或者解决它的原因。也许您可以显示完整的消息和StackTrace当我删除@TransactionManagement时,我在客户机中遇到了一个异常:javax.ejb.EJBException:java.lang.SecurityException。。。原因:com.sun.jts.jta.TransactionManagerImpl.rollback(TransactionManagerImpl.java:376)上的java.lang.SecurityException我不认为SecurityException与CMT有关,可能是:捕获它,或者解决它的原因。当我使用
@Transac时,也许您可以显示完整的消息和StackTrace