有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
}

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


共 (2) 个答案

  1. # 1 楼答案

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

    如果使用@EJB注入EJB,则容器只注入一个代理,因此它可以拦截EJB方法调用并执行必要的工作,如tx管理。然而,在您的案例中没有拦截,因为您正在进行本地方法调用

    在你的情况下会发生以下情况:

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

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

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