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