使用新交易

时间:2017-09-14 00:28:50

标签: java-ee transactions ejb scheduled-tasks

我使用带有@scheduled注释的EJB每10秒循环遍历所有上下文实体。所有上下文实体彼此无关,因此应为其更新方法创建新事务:

@Stateless
public class UpdateService {

    @EJB
    ContextDao contextDao;

    @Schedule(second = "*/10", minute = "*", hour = "*")
    public void update() {
        for(ContextEntity context : contextDao.findAllContexts()) {
            updateContext(context);
        }
    }

    public void updateContext(ContextEntity context) {
         // load data from db
         // update some stuff
         // save back to db
    }
}

现在我想为updateContext方法提供单个事务。因此,如果我在一个ContextEntity中出现任何错误,则只应该回滚此事务而不是整个循环。

  1. update和updateContext的正确TransactionAttributes是什么?
  2. 我是否必须为updateContext方法使用不同的EJB?
  3. 由于

1 个答案:

答案 0 :(得分:0)

我认为你想在循环中呼叫updateContext而不是update

定义的update - 方法具有属性TransactionAttributeType.REQUIRED,该属性是默认属性,可以保留。

updateContext - 方法应注释TransactionAttributeType.REQUIRES_NEW,但是......如果要调用该事务上下文,则必须使用

@Resource
SessionContext sessionContext;

并从sessionContext获取businessinterface以调用updateContext

例如,请查看SingletonEjb,查看方法methodCallUsingSessionContext