BMT EJB不进行回滚

时间:2013-12-12 14:15:40

标签: transactions ejb rollback

我有一个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()中完成的回滚没有效果一样。

这是什么问题?

0 个答案:

没有答案