Jakarta ee 是否可以在远程EJB中使用TransactionManagementType.CONTAINER?
是否可以在远程EJB实现中使用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
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