我是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次更新),并且没有任何意义。
谢谢!
答案 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管理的事务,而不是容器管理。