我有以下两个 EJB3.0 Bean
public class ExternalBean {
@Resource
private SessionContext ctx;
@EJB
protected DataBaseLogging dbLogger;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void doExternaljob() {
try{
.....
}catch(Exception e){
logger.log();
ctx.setRollbackOnly();
throw new Exception();
}
}
public class DataBaseLogging {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void log(){
//write log data to db
......
}
}
由于 EJB DatabaseLogging 的方法 log() 具有事务属性 REQUIRES_NEW,因此我希望如果它成功完成,数据将被写入 db,而与调用方方法 doExternaljob() 的结果无关。但这不是发生的事情。似乎 log() 方法也被回滚并且没有写入数据。如果我删除对 setRollbackOnly() 的调用,则数据写入正确。但是我可以确定在这种情况下通过抛出异常外部事务总是回滚吗?
这被认为是正常行为吗?