我使用带有@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中出现任何错误,则只应该回滚此事务而不是整个循环。
由于
答案 0 :(得分:0)
我认为你想在循环中呼叫updateContext
而不是update
。
定义的update
- 方法具有属性TransactionAttributeType.REQUIRED
,该属性是默认属性,可以保留。
updateContext
- 方法应注释TransactionAttributeType.REQUIRES_NEW
,但是......如果要调用该事务上下文,则必须使用
@Resource
SessionContext sessionContext;
并从sessionContext获取businessinterface以调用updateContext
例如,请查看SingletonEjb,查看方法methodCallUsingSessionContext