bean管理的事务如何工作?

时间:2013-06-25 13:40:14

标签: jsf transactions ejb 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();
        }
    }
}

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

当您致电userTransaction.begin()时,只需说JTA在数据库级别开始交易即可。 现在,您执行的所有数据修改都在事务内部完成。 如果一切正常,则执行到userTransaction.commit()并且数据库修复事务。 如果出现问题,请在catch块中调用userTransaction.rollback(),数据库将删除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管理的事务,而不是容器管理。