1

除了互联网上的无用教程和规范之外,找不到任何相关信息。

我现在正在努力解决一件事,如果你能帮忙的话。

事情就是这样。

假设我们有两个 EJB 版本 3.0,带有关于它们的事务类型的注释,一个是 bean 管理的(让它成为 BeanManaged),第二个是容器管理的(让它成为 ContainerManaged,多么有创意)。

然后会发生这种情况:

@TransactionBlahBlah(Type.BEAN)
class BeanManaged {

   @Inject
   private ContainerManaged contMngt; // here's the implicit container managed trnsactional bean ( not annotated or anything )

    void someMethod() {
         // some transaction creation and a bit of inserts and updates      
        contMngt.callingMethodThatIsGoingToCreateContainerManagedTransaction();

         // some batches that are inserts
        for( int y = 0 ; y < 100 ; y++ ) {
             for( int i = 100 ; i < 200 ; i ++ ) {
                    magicPreparedStatementOutOfNowhere.setParameter(666, "hell");
                    magicPreparedStatementOutOfNowhere.addBatch();
             }
             magicPreparedStatementOutOfNowhere.executeBatch();
        }
        transaction.commit(); // let's pretend it is not here
    }
}

在这一切的机制中发生了什么,bean 管理事务是否变成某种“孤立”的容器管理事务?他们混合吗?如果有的话,它们是如何交互的?一项交易是否与另一项交易分开

这是我的推论,但还有更多。

最后,当我尝试提交 bean 事务时,它说“您好,先生,此事务是托管的,并且禁止手动提交”,SQLException 为沙漠。

然后是批次的东西,我以某种方式收集。添加了 100 个批次后,我想执行它们,但实际上只执行了最后一个,似乎 addBatch 根本不起作用。

任何人都可以联系,或者遇到类似的事情是受欢迎的,每个巫师都会得到免费的饼干。

4

1 回答 1

0

您在容器管理的 bean 上指定了什么 TransactionAttribute?我建议强制。使用 Mandatory,容器不会为您启动事务。相反,它将通过确保除非事务正在进行,否则无法调用它来保护您的 bean。

这个相关问题也有一些有用的信息。

于 2015-04-17T16:30:54.133 回答