Bean 管理的事务如何工作?

Mci*_*anM 0 jsf ejb transactions javabeans bean-managed-transactions

我对 EJB 和 Bean 管理事务都很陌生。在放弃互联网之后,我发现我可以编写一个 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

GKl*_*mov 5

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

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

在 JSF 中,您可以创建@ManagedBeanOperationBean使用注释将其注入其中@EJB。你应该得到这样的东西

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

    public void doOperation() {
        operationBean.operation();
    }
}
Run Code Online (Sandbox Code Playgroud)

在你看来

<h:form>
    <h:commandButton action="#{operation.doOperation}" value="Do Operation"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)

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