首页 文章

异常时不会触发回滚

提问于
浏览
1

在过去的几天里,我一直在忙着头脑 . 我有一个MDB,其方法级别为 @TransactionAttribute(TransactionAttributeType.REQUIRED) . 在另一个EJB中调用的方法标记为 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) ,从而暂停MDB事务 . 当在新事务中抛出异常时,它不会回滚并将我的更改提交给databsse . 我用 @ApplicationException(rollback=true) 标记了我的检查异常这里是代码示例

public class MDB implements MessageListener {

    @EJB
    Foo foo;
    @Inject
    ExceptionHandler exceptionHandler;

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void onMessage(Message message) {
        //message gets unmarshalled here
        try {
            foo.makeChanges(unmarshalledMessage)
        } catch (MyException ex) {
            exceptionHandler.handleException(ex);
        }
    }
}

@Stateless
public class Foo {

    @EJB
    DatabaseDao databaseDao;

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void makeChanges(String unmarshalledMessage) throws MyException {
        //Some logic to handle message
        try (Connection conn = databaseDao.getConnection()) {
            for (ManipulatedString string : listOfManipulatedString) {
                try {
                    databaseDao.makeChanges(manipulatedString);
                    //RuntimeException thrown 
                } catch (RuntimeException ex) {
                    throw new MyException(ex);
                }
            }
        }
    }

}

@ApplicationException(rollback = true)
public class MyException extends Exception {
    public MyException() {
        super();
    }

    public MyException(String message) {
        super(message);
    }


    public MyException(String message, Throwable cause) {
        super(message, cause);
    }

    public MyException(Throwable cause) {
        super(cause);
    }
}

请记住,我只希望第二个事务回滚(在Foo类中创建的事务)而不是第一个事务(MDB中的事务) . 我明确地对负面测试提出了异常 .

我有记录逐个发送到数据库,因此 for . 在第三个记录上它失败了(我在做)并且它应该回滚并且不提交任何东西,但由于某种原因它会提交前一个 . 你知道为什么吗?

我只使用Java EE .

1 回答

  • 0

    我发现了我的问题 . 我没有使用正确的JDBC驱动程序 . 我使用的是没有全局事务的oracle.jdbc.OracleDriver . 我切换到oracle.jdbc.xa.client.OracleXADataSource并修复了问题 .

    我看到我的事务已创建,Foo事务按预期回滚 . 我使用weblogic监控工具来确定这一点 . 然后我意识到它与我的JDBC及其事务性有关 .

相关问题