我有一个 EJB 如下 -
class ActivityProcessor{
@Resource
private SessionContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean processActivity(Activity activity) throws Exception{
try{
//required code for processing activity
}catch(Exception ex){
//Exception while processing activity
handleException(ex,activity);
context.setRollbackOnly();
throw ex;
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void handleException(Exception ex, Activity activity) {
//Code to save this activity in exception table
}
}
我们有一个要求,如果处理失败,我们希望将活动保存在异常数据库表中。但是使用上面的代码,如果processActivity有异常,我会在handleException方法中得到事务超时异常。handleException单独工作正常。
如果这个 EJB 事务的问题,请建议我。
我的理解是,1.将为processActivity创建新事务
如果processActivity发生异常,会调用handleException。由于事务属性为REQUIRES_NEW,processActivity的事务会被挂起,handleException会创建新事务
如果handleException成功,handleException的事务将被保存。
processActivity 暂停的事务将被恢复,但由于 context.setRollbackOnly,它将被回滚。