0

我对 EJB 和 Bean Managed Transactions 都是新手。在网上报废后,我发现我可以编写一个 EJ 会话 Bean,它以“bean 管理的方式”进行事务,如下所示:

@TransactionManagement(value=TransactionManagementType.BEAN)
@Stateless
public class OperationBean {
    @Resource
    private UserTransaction userTransaction;
    public void operation() {
        try{
            userTransaction.begin();
            Op1();
            Op2();
            Op3();
            userTransaction.commit();
        } catch(Exception e){
            userTransaction.rollback();
        }
    }
}

但是,我不明白如果 Op3() 抛出异常会发生什么。Op1() 和 Op2() 如何撤消?

另一个问题是如何将它绑定到 JSF?我需要在 JSF 中编写一个表单,将其数据发送到服务器,并且 OperationBean 根据接收到的数据执行 3 次操作。这些操作确实涉及数据库操作(3 次更新)并且单独没有意义。

谢谢!

4

1 回答 1

5

当您调用时userTransaction.begin(),只需说 JTA 在数据库级别开始事务。现在您执行的所有数据修改都在事务内部完成。如果一切正常,则执行userTransaction.commit()并数据库修复事务。如果出现问题,您调用userTransaction.rollback()catch 块,数据库将删除您之后所做的所有修改begin()

用两个词很难解释数据库事务是如何工作的,但基本上数据库将事务期间的所有更改与其他客户端隔离,直到commit()或被rollback()调用,并防止您正在使用的数据的外部更新。

在 JSF 中,您可以使用注释创建@ManagedBean并注入您的代码。你应该得到这样的东西OperationBean@EJB

@ManagedBean
public class Operation {
    @EJB
    private OperationBean operationBean;

    public void doOperation() {
        operationBean.operation();
    }
}

在你看来

<h:form>
    <h:commandButton action="#{operation.doOperation}" value="Do Operation"/>
</h:form>

所以你做对了。假设您确实需要 bean 管理的事务,而不是容器管理的。

于 2013-06-25T13:58:22.390 回答