Java 当commit()在Spring编程事务中引发异常时,是否需要调用rollback()方法?

Java 当commit()在Spring编程事务中引发异常时,是否需要调用rollback()方法?,java,spring,transactions,rollback,Java,Spring,Transactions,Rollback,我有一个jUnit测试,测试我的实体(音乐家)是否必须有唯一的名称,我正在检查DB是否按照预期拒绝了它。我已决定在Spring中手动管理事务,以便更好地了解正在发生的事情,而不是使用@Transactional方法。我在PlatformTransactionManager的回滚方法的文档中读到,当提交抛出错误时,我不能在txManager上执行回滚,因为提交已经回滚了该事务。上面的链接是。但当我不调用这个回滚方法时,DB进入非法状态,整个模式被破坏,测试停止。当我添加一个IF以确保发送未完成,以

我有一个jUnit测试,测试我的实体(音乐家)是否必须有唯一的名称,我正在检查DB是否按照预期拒绝了它。我已决定在Spring中手动管理事务,以便更好地了解正在发生的事情,而不是使用@Transactional方法。我在PlatformTransactionManager的回滚方法的文档中读到,当提交抛出错误时,我不能在txManager上执行回滚,因为提交已经回滚了该事务。上面的链接是。但当我不调用这个回滚方法时,DB进入非法状态,整个模式被破坏,测试停止。当我添加一个IF以确保发送未完成,以及一个rollback方法调用时,一切都正常。代码如下:

@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,因此不会提交事务。

谢谢,但我说过提交会引发异常,所以失败只是为了确保提交抛出错误。那个么,为什么我必须回滚,即使在文档中说,当提交抛出异常时,不能手动回滚。。。请您向我解释一下,这是因为您使用的是编程事务,而不是容器管理器事务。您需要回滚。