我的调度程序是这样安排的
@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);
}
第一种方法更新一些预订,将它们保存到数据库,第二种方法使用更新的信息进一步处理并再次更新数据库。问题是更改不会反映在数据库中,除非第二次成功执行。此外,第二种方法中的异常会回滚第一种方法所做的成功更改。请让我知道发生了什么,以及如何使两种方法相互独立。
答案 0 :(得分:0)
我认为,因为您实际上没有定义事务的开始和结束,它由容器管理并跨越整个执行。
您可以使用Java EE中的注释来管理事务。查找JTA,它是交易的API。
答案 1 :(得分:0)
代码的主要问题是@TransactionAttribute
注释完全没有效果。在您的pollTimer()
方法中,您正在进行简单的本地方法调用,因此EJB容器不知道您希望为每个轮询器方法创建新事务。
如果使用@EJB
注入EJB,则容器仅注入代理,因此它可以拦截EJB方法调用并执行必要的工作,如tx管理。但是,在您的情况下没有拦截,因为您正在进行本地方法调用。
您的情况会发生以下情况:
pollTimer()
方法开始在容器管理的新tx中运行