我有一个Bean Maneged Transaction无状态EJB。在这个EJB中,有一种方法可以接收一个将被更新的实体。如果抛出异常,客户端将调用EJB中的另一个方法将此实体状态更新为error。
EJB接口
@Remote
interface EntityRemote {
public void updateEntity(Entity entity) throws Exception;
public void handleExcpetion(Entity entity, Exception exception);
}
EJB implmentation
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class EntitySessionBean implements EntityRemote {
@Resource
private UserTransaction tx;
public void updateEntity(Entity entity) throws Exception {
tx.begin();
try {
// make some manipulation, which can throw some Exception
enitityDAO.update(entity);
// Some more manipulation
tx.commit();
} catch(Exception e) {
tx.rollback();
throw e;
}
}
public void handleException(Entity entity, Exception exception) {
log.error(exception);
try {
tx.begin();
entity.setStatus(ERROR);
enitityDAO.update(entity);
tx.commit();
} catch (Exception e1) {
logger.exception(e1);
tx.rollback();
}
}
}
在客户端:
EntityRemote remote = // ...
Entity entity = // ...
try {
remote.updateEntity(entity);
} catch (Exception e) {
remote.handleException(entity, e);
}
如果在updateEntity()
中它在更新实体之后和提交之前被抛出一些异常,则会出现我的问题。我确认在数据库中不仅提交了handleException()
的修改,还提交了updateEntity()
中的修改。就像在updateEntity()
中完成的回滚没有效果一样。
这是什么问题?