我正在使用@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中遇到任何错误,则只能将此交易回滚而不是整个循环。
- 更新和UpdateContext的正确交易attributes是什么?
- 我是否必须使用其他EJB进行UpdateContext方法?
谢谢
我想您要在循环中调用updateContext
而不是update
。
所定义的 update
-method具有默认的属性 TransactionAttributeType.REQUIRED
,可以像路上保持一样。
updateContext
-method应注释TransactionAttributeType.REQUIRES_NEW
,但是...如果您想打电话给该交易,则必须使用
@Resource
SessionContext sessionContext;
并从SessionContext获取BusinessInterface以调用updateContext
例如,请查看SingletoneJB参见方法methodCallUsingSessionContext