gpt4 book ai didi

java - mdbcontext.setRollbacksOnly() 清除由 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释的 ejb 方法完成的插入

转载 作者:行者123 更新时间:2023-12-02 02:28:47 25 4
gpt4 key购买 nike

我正在使用 mdb-jms。我创建了一个具有 2 个方法的 EJB 无状态类。(i) 方法 insertInput() 被注释为 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),对表进行插入。(ii) 方法 getInput()(事务属性设置为 REQUIRED)从 DAO 层抛出异常。

首先从 MDB 类调用方法 insertInput(),然后调用方法 getInput()。

在 mdb 类中,catch block 保存代码 messagedrivencontext.setRollbacksOnly(),设置为在出现任何异常时回滚。

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void insertInput(Object obj) throws NewDataException {

/**** Invokes a dao method that inserts value into a table ****/
}

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void getInput(Object obj) throws NewDataException {

/*** invokes a DAO method that throws an exception ****/
}

期望:通过方法 insertInput() 完成的插入应该在表中可用,因为它是通过单独的事务启动的。仅应回滚由方法 getInput() 完成的插入(如果有)。

实际:通过方法 insertInput() 向数据库完成的插入也会从表中回滚,即使它是使用新事务完成的。

这实际上应该是这样的吗?如果是,有没有办法只回滚 Method getInput() 的更改?

最佳答案

该行为必须符合您的预期描述。当内部方法中事务类型为REQUIRES_NEW时,外部方法中的事务将恢复,直到内部事务提交或回滚,并且不会影响外部事务结果。

您应该验证方法 insertInput(Object obj) 不会引发任何未经检查的异常。

关于java - mdbcontext.setRollbacksOnly() 清除由 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释的 ejb 方法完成的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com