Java 当commit()在Spring编程事务中引发异常时,是否需要调用rollback()方法?
我有一个jUnit测试,测试我的实体(音乐家)是否必须有唯一的名称,我正在检查DB是否按照预期拒绝了它。我已决定在Spring中手动管理事务,以便更好地了解正在发生的事情,而不是使用@Transactional方法。我在PlatformTransactionManager的回滚方法的文档中读到,当提交抛出错误时,我不能在txManager上执行回滚,因为提交已经回滚了该事务。上面的链接是。但当我不调用这个回滚方法时,DB进入非法状态,整个模式被破坏,测试停止。当我添加一个IF以确保发送未完成,以及一个rollback方法调用时,一切都正常。代码如下:Java 当commit()在Spring编程事务中引发异常时,是否需要调用rollback()方法?,java,spring,transactions,rollback,Java,Spring,Transactions,Rollback,我有一个jUnit测试,测试我的实体(音乐家)是否必须有唯一的名称,我正在检查DB是否按照预期拒绝了它。我已决定在Spring中手动管理事务,以便更好地了解正在发生的事情,而不是使用@Transactional方法。我在PlatformTransactionManager的回滚方法的文档中读到,当提交抛出错误时,我不能在txManager上执行回滚,因为提交已经回滚了该事务。上面的链接是。但当我不调用这个回滚方法时,DB进入非法状态,整个模式被破坏,测试停止。当我添加一个IF以确保发送未完成,以
@Test
public void testAddMusicianWithNotUniqueName() throws Exception {
System.out.println("addMusicianWithNotUniqueName");
Musician musician1 = new Musician();
musician1.setName("Musician 1");
Musician musician2 = new Musician();
musician2.setName("Musician 1");
TransactionStatus status = null;
try {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
status = txManager.getTransaction(def);
musicianDao.addMusician(musician1);
musicianDao.addMusician(musician2);
txManager.commit(status);
fail("MusicianException was not thrown when musician's name was not unique");
} catch (DataAccessException ex) {
//now I added this code, even if
//commit thrown error so it has already cleaned the transaction as said in documentation
if(!status.isCompleted()){
//but it apparently didn't clean the transaction as it is still not completed
txManager.rollback(status);
}
}
}
你能给我解释一下吗?提前感谢。您尚未添加完整代码。但是,原因是您首先提交事务,然后使JUnit测试失败。事务将按照您的代码提交。如果不希望提交数据,请尝试以下操作:
fail("MusicianException was not thrown when musician's name was not unique");
txManager.commit(status);
这将抛出java.lang.AssertionError,因此不会提交事务。谢谢,但我说过提交会引发异常,所以失败只是为了确保提交抛出错误。那个么,为什么我必须回滚,即使在文档中说,当提交抛出异常时,不能手动回滚。。。请您向我解释一下,这是因为您使用的是编程事务,而不是容器管理器事务。您需要回滚。