Ejb,第二种方法中的错误回滚第一种方法

时间:2014-03-10 11:51:36

标签: java ejb scheduler jta

我的调度程序是这样安排的

@Schedule(minute = "*/5", hour = "*", persistent = false)
public void pollTimer() {

    startfirstPoller();

    startsecondPoller();

}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void startfirstPoller() {
// find all booking from database and update
bokingFacade.findAll();
    bokingFacade.update(booking);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void startsecondPoller() {
// find all booking updated from database and update
bokingFacade.findAll();
    bokingFacade.update(booking);
}

第一种方法更新一些预订,将它们保存到数据库,第二种方法使用更新的信息进一步处理并再次更新数据库。问题是更改不会反映在数据库中,除非第二次成功执行。此外,第二种方法中的异常会回滚第一种方法所做的成功更改。请让我知道发生了什么,以及如何使两种方法相互独立。

2 个答案:

答案 0 :(得分:0)

我认为,因为您实际上没有定义事务的开始和结束,它由容器管理并跨越整个执行。

您可以使用Java EE中的注释来管理事务。查找JTA,它是交易的API。

答案 1 :(得分:0)

代码的主要问题是@TransactionAttribute注释完全没有效果。在您的pollTimer()方法中,您正在进行简单的本地方法调用,因此EJB容器不知道您希望为每个轮询器方法创建新事务。

如果使用@EJB注入EJB,则容器仅注入代理,因此它可以拦截EJB方法调用并执行必要的工作,如tx管理。但是,在您的情况下没有拦截,因为您正在进行本地方法调用。

您的情况会发生以下情况:

  • 超时时pollTimer()方法开始在容器管理的新tx中运行
  • 第一个和第二个轮询方法在完全相同的tx中被调用。