过去几天我一直在低头。我有一个方法级@TransactionAttribute(TransactionAttributeType.REQUIRED)
的MDB。在另一个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。
答案 0 :(得分:0)
我发现了我的问题。我没有使用正确的JDBC驱动程序。我使用的是没有全局事务的oracle.jdbc.OracleDriver。我切换到oracle.jdbc.xa.client.OracleXADataSource并修复了问题。
我看到我的事务已创建,Foo事务按预期回滚。我使用weblogic监控工具来确定这一点。然后我意识到它与我的JDBC及其事务性有关。